一 、二叉樹的概念
二叉樹就是每個結點最多有兩個子樹的樹形儲存結構。
1、滿二叉樹和完全二叉樹
上圖就是典型的二叉樹,其中左邊的圖還叫做滿二叉樹,右邊是完全二叉樹。然後我們可以得出結論,滿二叉樹一定是完全二叉樹,但是反過來就不一定。滿二叉樹的定義是除了葉子結點,其它結點左右孩子都有,深度為k的滿二叉樹,結點數就是2的k次方減1。完全二叉樹是每個結點都與深度為k的滿二叉樹中編號從1到n一一對應。
2、樹的深度
樹的最大層次就是深度,比如上圖,深度是4。很容易得出,深度為k的樹,擁有的最大結點數是2的k次方減1。
3、樹的孩子,兄弟,雙親
上圖中,b,c是a的孩子,b,c之間互為兄弟,a是b,c的雙親。
二、二叉樹的先序、中序、後序遍歷
1.前序遍歷(dlr)
所謂前序遍歷是指在訪問根結點、遍歷左子樹與遍歷右子樹這三者中,首先訪問根結點,然後遍歷左子樹,最後遍歷右子樹;並且,在遍歷左、右子樹時,仍然先訪問根結點,然後遍歷左子樹,最後遍歷右子樹。因此,前序遍歷二叉樹的過程是乙個遞迴的過程。
下面是二叉樹前序遍歷的簡單描述:
若二叉樹為空,則結束返回。
否則:
(1)訪問根結點;
(2)前序遍歷左子樹;
(3)前序遍歷右子樹。
在此特別要注意的是,在遍歷左右子樹時仍然採用前序遍歷的法。如圖所示:
二叉樹進行前序遍歷,則遍歷的結果為f,c,a,d,b,e,g,h,p(稱為該二叉樹的前序序列)。
2.中序遍歷(ldr)
所謂中序遍歷是指在訪問根結點、遍歷左子樹與遍歷右子樹這三者中,首先遍歷左子樹,然後訪問根結點,最後遍歷右子樹;並且,在遍歷左、右子樹時,仍然先遍歷左子樹,然後訪問根結點,最後遍歷右子樹。因此,中序遍歷二叉樹的過程也是乙個遞迴的過程。
下面是二叉樹中序遍歷的簡單描述:
若二叉樹為空,則結束返回。
否則:
(1)中序遍歷左子樹;
(2)訪問根結點;
(3)中序遍歷左子樹。
在此也要特別注意的是,在遍歷左右子樹時仍然採用中序遍歷的方法。如圖所示:
二叉樹進行中序遍歷,則遍歷結果為a,c,b,d,f,e,h,g,p(稱為該二叉樹的中序序列)。
3.後序遍歷(lrd)
所謂後序遍歷是指在訪問根結點、遍歷左子樹與遍歷右子樹這三者中,首先遍歷左子樹,然後遍歷右子樹,最後訪問根結點,並且,在遍歷左、右子樹時,仍然先遍歷左子樹,然後遍歷右子樹,最後訪問根結點。因此,後序遍歷二叉樹的過程也是乙個遞迴的過程。
下面是二叉樹後序遍歷的簡單描述:
若二叉樹為空,則結束返回。否則:
(1)後序遍歷左子樹;
(2)後序遍歷右子樹;
(3)訪問根結點。
二叉樹進行後序遍歷,則遍歷結果為a,b,d,c,h,p,g,e,f。
二叉樹先序 中序 後序遍歷
題目 用遞迴和非遞迴方式,分別按照二叉樹先序 中序和後序列印所有的節點。我們約定 先序遍歷順序為根 左 右 中序遍歷順序為左 根 右 後序遍歷順序為左 右 根。遞迴實現 遞迴遍歷二叉樹 先序 public void preorderrecur node head system.out.println...
二叉樹先序遍歷 中序遍歷 後序遍歷
輸入二叉樹的先序遍歷序列和中序遍歷序列,輸出該二叉樹的後序遍歷序列。非建二叉樹版本 include includeusing namespace std string preord,inord void rebuild int preleft,int preright,int inleft,int ...
二叉樹先序遍歷 後序遍歷 中序遍歷
從根部 a 開始,然後開始遍歷左子樹,直接找到 b 檢視 b 有沒有左子樹,有 d,再檢視 d 有沒有子樹,沒有,d 已經是葉子,所以第二個是 d。倒回去,取中 b,第三個數是 b。檢視 b 有沒有右子樹,有 e 檢視 e 有沒有子樹,有 g 左 h 右 所有後面三個數是 egh 先查左子樹,存在繼...