二叉樹的遍歷
所謂二叉樹的遍歷,是指按某條搜索路徑訪問樹中的每個節點,使得每個節點均被訪問一次,而且僅被訪問一次。
遍歷二叉樹需要決定對根節點N、左子樹L、右子樹R的訪問順序(按照先遍歷左子樹在遍歷右子樹的原則),常見的遍歷次序有先序(NLR)、中序(LNR)、後序(LRN)三種遍歷算法,這也是最常見的二叉樹遍歷算法。
其中的“序”實際上就是根節點的訪問時機。
1. 二叉樹的數據結構
typedef struct BTNode{
int data; //保存節點中的值
struct BTNode *lchild; //左孩子指針
struct BTNode *rchild; //右孩子指針
}BTNode,*BiTree;
這裏我使用的比較適合基礎學者的二叉樹的存儲結構,不同的存儲結構,實現二叉樹操作的算法也會不同,因此要根據實際應用場合(樹的形態和需要進行的運算)來選擇合適的存儲結構。
不說廢話了,哈哈肯定把你急死了!
2.二叉樹的遞歸遍歷
1. 先序遍歷
先序遍歷(PreOrder)的操作如下:
①首先若二叉樹爲空,則什麼也不做;否則,
- 訪問根節點;
- 先序遍歷左子樹;
- 先序遍歷右子樹。
對應的遞歸算法如下:
void PreOrder(BiTree T){
if(T!=NULL){
visit(T); //訪問跟結點
PreOrder(T->lchild); //訪問左子樹
PreOrder(T->rchild); //訪問右子樹
}
}
這裏舉一個例子做說明吧(後面都是使用這個例子),例子二叉樹如下:
這樣一來先序遍歷所得到的節點序列爲1 2 4 6 3 5.
2. 中序遍歷
中序遍歷(InOrder)的操作如下:
①首先若二叉樹爲空,則什麼也不做;否則,
- 中序遍歷左子樹;
- 訪問根節點;
- 中序遍歷右子樹。
對應的遞歸算法如下:
void InOrder(BiTree T){
if(T!=NULL){
InOrder(T->lchild);//遞歸遍歷左子樹
visit(T);//訪問根結點
InOrder(T->lchild);//遞歸遍歷右子樹
}
}
這樣一來中序遍歷所得到的節點序列爲2 6 4 1 3 5.
3. 後序遍歷
後序遍歷(PostOrder)的操作如下:
①首先若二叉樹爲空,則什麼也不做;否則,
- 後序遍歷左子樹;
- 後序遍歷右子樹;
- 訪問根節點。
對應的遞歸算法如下:
void PostOrder(BiTree T){
if(T!=NULL){
PostOrder(T->lchild);//遞歸遍歷左子樹
PostOrder(T->rchild);//遞歸遍歷左子樹
visit(T); //訪問根結點
}
}
這樣一來後序遍歷所得到的節點序列爲6 4 2 5 3 1.
這是二叉樹結點的遞歸遍歷,實現起來比較簡單,很好地使用了遞歸的思想。
二叉樹的非遞歸遍歷在我的另一邊文章當中
連接如下:二叉樹的非遞歸遍歷
最後,送大家一句話:知識並不能爲我們帶來財富,但是能使我們有能力去創造財富。