前序遍歷:就是從二叉樹的根結點出發,當第一次到達結點時就輸出結點數據,按照先向左在向右的方向訪問
ABDHIEJCFG 根節點在第一位
中序遍歷就是從二叉樹的根結點出發,當第二次到達結點時就輸出結點數據,按照先向左在向右的方向訪問
HDIBJEAFCG 根節點在中間 中序遍歷順序和大小順序是相同的
後序遍歷就是從二叉樹的根結點出發,當第三次到達結點時就輸出結點數據,按照先向左在向右的方向訪問
HIDJEBFGCA 根節點在最後一位
層次遍歷就是按照樹的層次自上而下的遍歷二叉樹
ABCDEFGHIJ 根節點在第一位
3.8.6 遍歷常考考點
對於二叉樹的遍歷有一類典型題型。
1)已知前序遍歷序列和中序遍歷序列,確定一棵二叉樹。
例題:若一棵二叉樹的前序遍歷爲ABCDEF,中序遍歷爲CBAEDF,請畫出這棵二叉樹。
分析:前序遍歷第一個輸出結點爲根結點,故A爲根結點。早中序遍歷中根結點處於左右子樹結點中間,故結點A的左子樹中結點有CB,右子樹中結點有EDF。
如圖3.14所示:
圖3.14
按照同樣的分析方法,對A的左右子樹進行劃分,最後得出二叉樹的形態如圖3.15所示:
圖3.15.png
2)已知後序遍歷序列和中序遍歷序列,確定一棵二叉樹。
後序遍歷中最後訪問的爲根結點,因此可以按照上述同樣的方法,找到根結點後分成兩棵子樹,進而繼續找到子樹的根結點,一步步確定二叉樹的形態。
注:已知前序遍歷序列和後序遍歷序列,不可以唯一確定一棵二叉樹。中序確定左右節點
/*二叉樹的前序遍歷遞歸算法*/
void PreOrderTraverse(BiTree T)
{
if(T==NULL)
return;
printf("%c", T->data); /*顯示結點數據,可以更改爲其他對結點操作*/
PreOrderTraverse(T->lchild); /*再先序遍歷左子樹*/
PreOrderTraverse(T->rchild); /*最後先序遍歷右子樹*/
}
/*二叉樹的中序遍歷遞歸算法*/
void InOrderTraverse(BiTree T)
{
if(T==NULL)
return;
InOrderTraverse(T->lchild); /*中序遍歷左子樹*/
printf("%c", T->data); /*顯示結點數據,可以更改爲其他對結點操作*/
InOrderTraverse(T->rchild); /*最後中序遍歷右子樹*/
}
/*二叉樹的後序遍歷遞歸算法*/
void PostOrderTraverse(BiTree T)
{
if(T==NULL)
return;
PostOrderTraverse(T->lchild); /*先後序遍歷左子樹*/
PostOrderTraverse(T->rchild); /*再後續遍歷右子樹*/
printf("%c", T->data); /*顯示結點數據,可以更改爲其他對結點操作*/
}