二叉樹及先序,中序,後序遍歷

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/-

 對於三種遍歷,能夠這樣去想,就比較容易理解了,從根開始一直往左子樹遍歷,到底後,而後退回一個點,遍歷右子樹的全部左子樹,如此循環,若是是先序,就在第一次訪問節點的時候進行處理,若是是中序就是第二次訪問節點的時候處理,若是是後序就第三次訪問的時候進行處理。只要記住結點的三次訪問分別是幹什麼的,就能夠很好的理解三次遍歷過程,只有熟練掌握了三種遍歷,才能用算法去實現樹的各類操做。

相關文章
相關標籤/搜索