什麼是二叉樹?
二叉樹是數據結構中最基礎也最重要的結構之一,就像蓋房子先打地基一樣,理解二叉樹能幫你後續輕鬆掌握更復雜的結構(比如堆、紅黑樹等)。
想象一下,二叉樹長得像一棵“分叉樹”——每一個“分叉點”都是一個“節點”,每個節點最多能分出兩個“子節點”,左邊的叫“左子節點”,右邊的叫“右子節點”。沒有子節點的節點叫“葉子節點”(就像樹的葉子一樣)。
舉個簡單的例子:你家院子裏有一棵蘋果樹,每個蘋果可以看作一個“節點”,連接蘋果和樹幹的樹枝就是“邊”。如果樹幹是“根節點”,它可能分出兩根樹枝(左枝和右枝),每根樹枝上又可能有多個蘋果(子節點),但每根樹枝最多隻能有兩個蘋果(因爲二叉樹每個節點最多兩個子節點)。
二叉樹的“零件清單”:基本術語¶
要畫二叉樹,得先認識它的“零件”:
- 節點:樹的基本單元,裏面可以放數據(比如數字、字符串等)。
- 根節點:樹的“最頂層”節點,沒有父節點,是樹的起點。
- 葉子節點:沒有子節點的節點,是樹的“最底層”。
- 子節點:從某個節點“長”出來的下一層節點(左子節點或右子節點)。
- 父節點:有子節點的節點(比如“根節點”是“左子節點”的父節點)。
- 左子樹/右子樹:一個節點的左子節點和它的所有後代組成“左子樹”,右子節點和它的所有後代組成“右子樹”。
手把手畫二叉樹:從簡單到複雜¶
現在,我們用“畫圖法”一步步掌握二叉樹的畫法,跟着步驟畫,你會發現超簡單!
第一步:最簡單的二叉樹——只有根節點¶
先畫一個“圓圈”代表根節點,裏面寫個數字(比如1)。這棵樹只有根節點,沒有子節點,所以它也是葉子節點。
1
第二步:根節點只有左子節點¶
在根節點的正下方偏左畫一個小圓圈(左子節點),裏面寫數字(比如2)。根節點的右邊暫時不畫(表示沒有右子節點)。
1
/
2
第三步:根節點只有右子節點¶
在根節點的正下方偏右畫一個小圓圈(右子節點),裏面寫數字(比如2)。左邊不畫。
1
\
2
第四步:根節點有左右兩個子節點¶
根節點下面偏左畫左子節點(比如2),偏右畫右子節點(比如3)。
1
/ \
2 3
第五步:給左子節點再“長”出子節點¶
以第二步的樹爲例,左子節點2可以繼續長左子節點(4)和右子節點(5)。此時樹的結構是:
1
/ \
2 3
/ \
4 5
這裏要注意:每個節點最多隻能有兩個子節點,不能多畫。比如如果2下面畫了三個子節點,那就不是二叉樹了!
第六步:給右子節點也“長”出子節點¶
繼續在第四步的基礎上,給右子節點3加左子節點6和右子節點7:
1
/ \
2 3
/ \ / \
4 5 6 7
第七步:判斷“不是二叉樹”的錯誤畫法¶
錯誤例子1:某個節點有三個子節點(比如根節點1下面畫三個分支):
1
/|\
2 3 4 // 這不是二叉樹!
錯誤例子2:子節點位置混亂(比如左子節點的右子節點比根節點的右子節點還高)——畫圖時儘量保持層次,根節點在最上,子節點在根的下一層,孫子節點在子節點的下一層,以此類推。
二叉樹的“身份驗證”:怎麼判斷是二叉樹?¶
只要滿足兩個條件,就是二叉樹:
- 每個節點最多有0、1或2個子節點(不能超過2個);
- 所有子節點的位置是有序的(左子節點和右子節點有明確區分,不能交換順序而改變樹的結構)。
二叉樹遍歷與畫圖結合(簡單版)¶
知道了怎麼畫樹,那怎麼通過“遍歷結果”反推樹的結構呢?這裏先簡單介紹三種遍歷方式(後續會深入):
- 前序遍歷(根→左→右):先畫根節點,再畫左子樹,最後畫右子樹。
- 中序遍歷(左→根→右):先畫左子樹,再畫根節點,最後畫右子樹。
- 後序遍歷(左→右→根):先畫左子樹,再畫右子樹,最後畫根節點。
舉例:假設前序遍歷結果是 1 2 4 5 3 6 7,怎麼畫出樹?
- 前序第一個是根節點1,所以先畫1。
- 前序剩下的是左子樹(2 4 5)和右子樹(3 6 7)。
- 左子樹的第一個是2,所以2是1的左子節點。
- 2的前序剩下4、5,4是2的左子節點,5是2的右子節點。
- 右子樹的第一個是3,所以3是1的右子節點。
- 3的前序剩下6、7,6是3的左子節點,7是3的右子節點。
最終畫出的樹和之前第四步加第五步的例子一致:
1
/ \
2 3
/ \ / \
4 5 6 7
總結:畫樹是理解二叉樹的“金鑰匙”¶
二叉樹的“畫”是學習的核心——通過畫圖,你能直觀看到每個節點的位置、子節點的數量和層次關係。剛開始可能覺得難,多畫幾次簡單的樹(比如只有根、只有左/右孩子、三層樹),很快就能掌握。
記住:二叉樹是堆、二叉搜索樹、哈夫曼樹等複雜結構的“地基”,畫樹的過程不僅能幫你理解基礎,還能爲後續學習算法(比如排序、查找)打下堅實基礎。
現在,你可以找一張紙,嘗試畫一棵包含根、左右孩子、孫子節點的二叉樹,動手畫一兩個例子,你會發現:二叉樹,原來這麼簡單!