1、什麼是二叉樹算法
每一個結點至多隻有兩棵子樹,而且,二叉樹有左右之分不能隨便顛倒位置。spa
2、二叉樹的存儲形式指針
一、順序存儲結構code
用一組地址連續的存儲單元以此自上而下、自左從右的存儲二叉樹的結點元素。這種結構便於遍歷二叉樹查找元素,可是會浪費大量內存空間。blog
二、鏈式存儲結構遞歸
每一個結點有指向左右子樹的指針,自己的數據內容,還能夠加上指向雙親的指針。這樣相對於順序存儲結構可以節省內存空間。內存
3、二叉樹結構體class
typedef struct Node{ int data; Node *lchild; Node *rchild; }Node;
4、先序遍歷二叉樹
一、先訪問根節點循環
二、先序遍歷左子樹
三、先序遍歷右子樹
代碼(遞歸):
void BL(tree* T){
printf("%d",T->data); if(T->lchild!=NULL) BL(T->lchild); if(T->rchild!=NULL) BL(T->rchild); }
5、中序遍歷
一、中序遍歷左子樹
二、訪問根節點
三、中序遍歷右子樹
代碼(遞歸):
void BL(tree* T) { if(T->lchild!=NULL) BL(T->lchild);
printf("%d",T->data); if(T->rchild!=NULL) BL(T->rchild); }
6、後序遍歷
一、後序遍歷左子樹
二、後序遍歷右子樹
三、訪問根節點
代碼(遞歸):
void BL(tree* T) { if(T->lchild!=NULL) BL(T->lchild); if(T->rchild!=NULL) BL(T->rchild); printf("%d",T->data); }
7、例子
上圖的先序:-+a*b-cd/ef
中序:a+b*c-d-e/f
後序:abcd-*+ef/-
對於三種遍歷,能夠這樣去想,就比較容易理解了,從根開始一直往左子樹遍歷,到底後,而後退回一個點,遍歷右子樹的全部左子樹,如此循環,若是是先序,就在第一次訪問節點的時候進行處理,若是是中序就是第二次訪問節點的時候處理,若是是後序就第三次訪問的時候進行處理。只要記住結點的三次訪問分別是幹什麼的,就能夠很好的理解三次遍歷過程,只有熟練掌握了三種遍歷,才能用算法去實現樹的各類操做。