目錄二叉樹的遍歷
葉子節點全都在最底層,除了葉子節點之外,每個節點都有左右兩個子節點
葉子節點都在最底下兩層,最後一層的葉子節點都靠左排列,並且除了最後一層,其他層的節點個數都要達到最大
2是滿二叉樹,3是完全二叉樹
要理解完全二叉樹定義的由來,需要先了解一棵二叉樹的儲存
想要儲存一棵二叉樹,有兩種方法,一種是基於指標或者引用的二叉鏈式儲存法,一種是基於陣列的順序儲存法。
圖中應該可以很清楚地看到,每個節點有三個字段,其中乙個儲存資料,另外兩個是指向左右子節點的指標。我們只要拎住根節點,就可以通過左右子節點的指標,把整棵樹都串起來。
這種儲存方式比較常用。大部分二叉樹**都是通過這種結構來實現的
把根節點儲存在下標i = 1的位置,那左子節點儲存在下標2 * i = 2
的位置,右子節點儲存在2 * i + 1 = 3
的位置。
以此類推,b節點的左子節點儲存在2 * i = 2 * 2 = 4的位置,右子節點儲存在2 * i + 1 = 2 * 2 + 1 = 5的位置
如果節點x儲存在陣列中下標為i的位置,下標為2 * i 的位置儲存的就是左子節點,下標為2 * i + 1的位置儲存的就是右子節點。不過,剛剛舉的例子是一棵完全二叉樹,所以僅僅「浪費」了乙個下標為0的儲存位置。反過來,下標為i/2的位置儲存就是它的父節點。通過這種方式,我們只要知道根節點儲存的位置(一般情況下,為了方便計算子節點,根節點會儲存在下標為1的位置),這樣就可以通過下標計算,把整棵樹都串起來
如果是非完全二叉樹,其實會浪費比較多的陣列儲存空間。你可以看我舉的下面這個例子
所以,如果某棵二叉樹是一棵完全二叉樹,那用陣列儲存無疑是最節省記憶體的一種方式。因為陣列的儲存方式並不需要像鏈式儲存法那樣,要儲存額外的左右子節點的指標。這也是為什麼完全二叉樹會單獨拎出來的原因,也是為什麼完全二叉樹要求最後一層的子節點都靠左的原因。
經典的方法有三種,前序遍歷、中序遍歷和後序遍歷。 其中,前、中、後序,表示的是節點與它的左右子樹節點遍歷列印的先後順序。
對於樹中的任意節點來說,先列印這個節點,然後再列印它的左子樹,最後列印它的右子樹。(本左右)
對於樹中的任意節點來說,先列印它的左子樹,然後再列印它本身,最後列印它的右子樹。(左本右 有序輸出)
對於樹中的任意節點來說,先列印它的左子樹,然後再列印它的右子樹,最後列印這個節點本身(左右本 左右都遍歷完了在操作本身,釋放二叉樹時使用 )
前序遍歷的遞推公式:
preorder(r) = print r->preorder(r->left)->preorder(r->right)
中序遍歷的遞推公式:
inorder(r) = inorder(r->left)->print r->inorder(r->right)
後序遍歷的遞推公式:
postorder(r) = postorder(r->left)->postorder(r->right)->print r
1個節點有左右子樹,被分為3個點
遞迴的訪問整棵樹的時候都要訪問這三個點
二叉樹的前中後序遍歷(遞迴方式)
二叉樹 二叉樹
題目描述 如上所示,由正整數1,2,3 組成了一顆特殊二叉樹。我們已知這個二叉樹的最後乙個結點是n。現在的問題是,結點m所在的子樹中一共包括多少個結點。比如,n 12,m 3那麼上圖中的結點13,14,15以及後面的結點都是不存在的,結點m所在子樹中包括的結點有3,6,7,12,因此結點m的所在子樹...
樹 二叉樹 滿二叉樹 完全二叉樹 完滿二叉樹
目錄名稱作用根 樹的頂端結點 孩子當遠離根 root 的時候,直接連線到另外乙個結點的結點被稱之為孩子 child 雙親相應地,另外乙個結點稱為孩子 child 的雙親 parent 兄弟具有同乙個雙親 parent 的孩子 child 之間互稱為兄弟 sibling 祖先結點的祖先 ancesto...
二叉樹,完全二叉樹,滿二叉樹
二叉樹 是n n 0 個結點的有限集合,它或者是空樹 n 0 或者是由乙個根結點及兩顆互不相交的 分別稱為左子樹和右子樹的二叉樹所組成。滿二叉樹 一顆深度為k且有2 k 1個結點的二叉樹稱為滿二叉樹。說明 除葉子結點外的所有結點均有兩個子結點。所有葉子結點必須在同一層上。完全二叉樹 若設二叉樹的深度...