二叉樹是樹結構的特例,現實生活中見的比較多的是多叉樹。由於二叉樹的鏈結浪費率最低,所以我們常常將樹轉化為二叉樹來操作,這樣不僅降低鏈結浪費率,而且還可以使得操作更加簡便。
1. 樹轉化為二叉樹
樹轉化為二叉樹的我們通常使用 child-sibling(leftmost-child-next-right-sibling)法則,它的執行步驟如下:
將樹中節點的所有兄弟節點用橫線連線起來
刪除所有與子節點的鏈結,只保留與最左邊子節點的鏈結
順時針旋轉45度
示例:
我們將下圖的樹轉化為二叉樹
步驟一:將各個兄弟節點連線起來
步驟二:刪除所有子節點之間的鏈結,只保留最左邊父子節點的鏈結。
步驟三:順時針旋轉45度
二、二叉樹轉化為樹
二叉樹轉化為多叉樹的方法就是樹轉化為二叉樹的逆向步驟,步驟如下:
逆時針旋轉45度
對每一層新增父子之間的鏈結, 斷掉兄弟節點之間的鏈結
調整樹的角度
示例:
我們仍以上面的為例,將二叉樹轉化為多叉樹。
步驟一:逆時針旋轉45度
對每一層新增父子之間的鏈結, 斷掉兄弟節點之間的鏈結
調整樹的角度
三、森林轉化為二叉樹
如果有好幾棵樹,那麼我們就稱其為森林,森林也可以轉化為二叉樹,轉化步驟如下:
從左到右將每棵樹的樹根連線起來
按照樹轉化為二叉樹的方法操作
示例:
將下圖所示的森林轉化為二叉樹
四、二叉樹轉化為森林
既然我們可以將森林轉化為二叉樹,那麼當然也可以將二叉樹轉化為森林了。其轉化方法就是森林轉二叉樹的倒退,如下所示:
示例:
這次我們找乙個稍微複雜點的二叉樹,將其轉化為森林,如下圖所示:
五、樹 & 森林的遍歷
與二叉樹的遍歷方法一樣,樹的遍歷方法也有前序遍歷、中序遍歷、後序遍歷3中方法,但是方法略微有一些差異。
樹的遍歷
前序遍歷
先訪問樹根root
再以前序遍曆法一次遍歷tree1、tree2…tree n
中序遍歷
先以中序遍曆法遍歷tree1
訪問樹根root
以中序遍曆法依次遍歷tree2、…tree n
後序遍歷
以後序遍曆法依次遍歷tree1、tree2…tree n
訪問樹根root
森林的遍歷
前序遍歷
如果森林為空,直接返回
遍歷森林中第一棵樹的樹根
按前序遍歷第一棵樹的子樹群
按前序遍歷森林中其他樹
中序遍歷
如果森林為空,直接返回
以中序遍歷第一棵樹的子樹群
中序遍歷森林中第一棵樹的的樹根
以中序法遍歷森林中的其他樹
後序遍歷
如果森林為空,直接返回
按後序遍歷森林中第一棵樹的子樹群
按後序法遍歷森林中的其他樹
遍歷森林中的第一棵樹的樹根
示例:
遍歷如下森林
前序遍歷:abecdfghi
中序遍歷:ebcdaghfi
後序遍歷:ebcdghifa
六、唯一二叉樹
如果我們知道二叉樹的中序與前序遍歷結果或者中序與後序遍歷結果,我們可以根據這些結果求得唯一二叉樹,但是如果只是知道前序與後序遍歷結果,則無法唯一確定二叉樹。
上面就是樹、森林、二叉樹之間的關係了,圖畫的比較醜,大家不要介意哈…
二叉樹 樹 森林轉換
1 加線。在所有兄弟結點之間加一條連線。2 去線。樹中的每個結點,只保留它與第乙個孩子結點的連線,刪除它與其它孩子結點之間的連線。3 層次調整。以樹的根節點為軸心,將整棵樹順時針旋轉一定角度,使之結構層次分明。注意第乙個孩子是結點的左孩子,兄弟轉換過來的孩子是結點的右孩子 1 把每棵樹轉換為二叉樹。...
樹轉換為二叉樹
輸入一顆普通有序樹,將它轉換為對應的二叉鍊錶儲存,然後輸出該二叉樹的先序和後序遍歷序列。包含多組測試資料。每組測試資料第1行為樹的結點個數n 1 n 26 接下來包含n行,其中第i行 1 n n 的資料依次為結點i的資料值ai 為乙個小寫字母 後面各元素為結點i的兒子序列,以0結束。若ai後僅含乙個...
樹 二叉樹 滿二叉樹 完全二叉樹 完滿二叉樹
目錄名稱作用根 樹的頂端結點 孩子當遠離根 root 的時候,直接連線到另外乙個結點的結點被稱之為孩子 child 雙親相應地,另外乙個結點稱為孩子 child 的雙親 parent 兄弟具有同乙個雙親 parent 的孩子 child 之間互稱為兄弟 sibling 祖先結點的祖先 ancesto...