資料結構篇:二叉樹(三:根據中序和後序遍歷結果推算出完整二叉樹)
阿新 • • 發佈:2018-11-26
我們先理解一下前中後序遍歷,這是基礎。
//前序遍歷 void Tree::PreOrderTraverse(BiTree *T) { if(!T) { return ; } else { cout<<T->data<<" "; PreOrderTraverse(T->lchild); PreOrderTraverse(T->rchild); } } //中序遍歷 void Tree::InOrderTraverse(BiTree *T) { if(!T) { return ; } else { InOrderTraverse(T->lchild); cout<<T->data<<" "; InOrderTraverse(T->rchild); } } //後序遍歷 void Tree::LastOrderTraverse(BiTree *T) { if(!T) { return ; } else { LastOrderTraverse(T->lchild); LastOrderTraverse(T->rchild); cout<<T->data<<" "; } }
我們理解到以下幾點:
- 前序遍歷是從一個根節點左子樹開始遍歷,同時輸出,當左子樹為空,就遍歷右子樹,右子樹不為空就輸出
- 中序遍歷是從一個根節點左子樹開始遍歷,直到它的左子樹為空,就輸出,然後輸出此根節點,然後遍歷右子樹,同理輸出
- 後序遍歷也是從一個根節點左子樹開始遍歷,直到它的左右子樹都為空,就輸出,然後遍歷右子樹,同理輸出,最後輸出根節點
比如這個二叉樹
我的分析方法是按照後序遍歷的結果進行分塊推算
舉個例子
二叉樹的中序遍歷CBEFDGAJILKHNOMP
後序遍歷CFEGDBJLKIONPMHA
請推算出整個二叉樹
1.先看後序遍歷結果,A是最後一位,所以A就是頂點,然後A前一位是H,所以H為A的右子樹頂點,
2.又由中序遍歷結果,以A為分界點,將樹分為兩部分。
又由後序遍歷結果,知B為A的左子樹頂點
所以目前為止我們的二叉樹為
3.從左子樹開始分析
由中序遍歷結果知,C為B的左子樹頂點。D為B的右子樹頂點
繼續同理分析,G為D的右子樹頂點,而對於EF,中序遍歷順序為EF,後序遍歷為FE,只有一種情況,E為F的雙親結點
且F為E的右子樹頂點,因為如果F為E的左子樹頂點,那麼中序遍歷的結果就是FE,而不是EF。至此,左子樹推算完畢。
4.然後是A的右子樹
由中序遍歷分析得,JILK為H的左子樹部分,NOMP為H的右子樹部分
先分析JILK,I為H的左子樹頂點,M為H的右子樹頂點
由中序遍歷知I的左子樹為J,右子樹為LK,並且對於LK,K為I的右子樹頂點,L為K的左子樹頂點,因為如果L為K的右子樹頂點,中序遍歷結果將是KL
再分析NOMP
由中序遍歷,P為M的右子樹頂點,NO為M的左子樹部分,且中序遍歷結果為NO,後序遍歷結果為ON,所以N為M的左子樹頂點,O為N的右子樹頂點,所以有
至此二叉樹已經完整的推算出來了。
可能看起來很複雜,但是大家在掌握後序遍歷,中序遍歷的基礎上進行理解分析得話,還是比較容易掌握的。多多練習就好。