在二叉樹的遍歷中,我們知道,給定一棵二叉樹和一種遍歷方法,就可以確定該二叉樹相應的線性序列。那麼,根據給定的遍歷序列能否唯一的確定一棵二叉樹呢?
顯然,只由一種序列是無法確定二叉樹的,要根據遍歷序列確定二叉樹,至少需要知道該二叉樹的兩種遍歷序列。
表 6-1 列出了兩種遍歷序列組合確定二叉樹的情況。
例已知一棵二叉樹的先序序列與中序序列分別為:
a b c d e f g h i
b c a e d g h f i
試構造該二叉樹。
分析:根據定義,二叉樹的先序遍歷是先訪問根結點,其次再按先序遍歷方式遍歷根 結點的左子樹,最後按先序遍歷方式遍歷根結點的右子樹。這就是說,在先序序列中,第一 個結點一定是二叉樹的根結點。如下圖(a)所示。
另一方面,中序遍歷是先遍歷左子樹,然後訪問根結點,最後再遍歷右子樹。這樣, 根結點在中序序列中必然將中序序列分割成兩個子串行,前乙個子串行是根結點的左子樹的 中序序列,而後乙個子串行是根結點的右子樹的中序序列。如下圖(b)所示。
根據這兩個子串行,在先序序列中根據中序序列對應的左子樹的先序序列和右子樹的先 序序列。在先序序列中,左子串行的第乙個結點是左子樹的根結點,右子串行的第乙個結點 是右子樹的根結點。這樣,就確定了二叉樹的三個結點。同時,左子樹和右子樹的根結點又 可以分別把左子串行和右子串行劃分為兩個子串行,如此遞迴下去,當取盡先序序列中的結 點時,便可以得到一棵二叉樹。
具體到本題目,首先由先序序列可知,結點 a 是二叉樹的根結點。其次,根據中序序列,在 a 之前的所有結點都是根結點左子樹的結點,在 a 之後的所有結點都是根結點右子 樹的結點,由此得到下圖(a)所示的狀態。然後再對左子樹進行分解,得知 b 是左子樹的 根結點,又從中序序列知道,b 的左子樹為空,b 的右子樹只有乙個結點 c。接著對 a 的右子樹進行分解,得知 a 的右子樹的根結點為 d;而結點 d 把其餘結點分成兩部分,即左子 樹為 e,右子樹為 f、g、h、i,如下圖(b)所示。接下去的工作就是按上述原則對 d 的右子樹繼續分解下去,最後得到如下圖(c)所示的整棵二叉樹。
由兩種遍歷序列確定二叉樹
已知中序和後序遍歷 typedef int elemtype typedef struct tnode position typedef position bintree typedef struct tnode bintree creat int a,int b,int n 陣列a,b分別存放中序...
由遍歷序列確定二叉樹 資料結構
由二又樹的遍歷可知,任意一棵二又樹的先序 中序 後序遍歷序列均是唯一的。由先序和中序序列,或由中序和後序序列,均可以唯一確定一棵二叉樹。注意 由先序和後序無法確定一顆二叉樹 1.由先序和中序序列確定二叉樹 根據二叉樹遍歷的定義可知,二叉樹的先序遍歷是先訪問根結點d,其次遍歷左子樹l,最後遍歷右子樹r...
根據遍歷序列確定二叉樹
1.在先序序列中,第乙個結點一定是二叉樹的根結點 2.在中序序列中,根結點必然將中序序列分割成兩個子串行 前乙個子串行是根結點的左子樹的中序序列,後乙個是右子樹的 3.根據這兩個子串行,在先序序列中找到對應的左右子串行 4.在先序序列中,左子串行的第乙個結點是左子樹的根結點,右子串行同理 5.如此遞...