建立一顆二叉鍊錶的樹 5個域 中序線索化 樹的種類

2021-10-11 02:36:04 字數 1540 閱讀 8718

所有節點只有0或者兩個節點

假如該二叉樹有n層

前n-1層的節點都排滿

最後第n層的所有節點都靠左排列,不一定排滿

也叫二叉搜尋樹

left.val<=parent.val

parent.val<=right.val

可以是空樹。

假如不是空樹,任何乙個結點的左子樹與右子樹都是平衡二叉樹,並且高度之差的絕對值不超過 1

是一種帶權路徑長度最短的二叉樹,也稱為最優二叉樹。

帶權路徑長度達到最小,就是最優二叉樹

由權值為9,5,2,7的四個葉子節點構造一棵最優二叉樹,該樹的帶權路徑長度為:44

乙個有n個結點的二叉鍊錶。每乙個結點有指向左右孩子的兩個指標域,一共是2n個指標域。n個結點的二叉樹一共同擁有n-1條分支線(根結點無前驅),存在2n-(n-1)=n+1個空指標域

將指向前驅和後驅的指標稱為線索,加上線索的二叉鍊錶則稱為線索鍊錶;加上線索的二叉樹稱為線索二叉樹(threaded binary tree)

中序遍歷結果:h、d、i、b、j、j、e、a、f、c、g

中序遍歷後,將所有的空指標域中的rchild,改為指向它的後繼結點。通過指標知道h的後繼是d(①),i的後繼是b(②),j的後繼是e(③),e的後繼是a(④),f的後繼是c(⑤),g的後繼因為不存在而指向null(⑥)。此時共有6個空指標域被利用

將這棵二叉樹的所有空指標域中的lchild,改為指向當前結點的前驅。h的前驅是null(①),i的前驅是d(②),j的前驅是b(③),f的前驅是a(④),g的前驅是c(⑤)。一共5個空指標域被利用,正好和上面的後繼加起來是11個

線索二叉樹,等於是把一棵二叉樹轉變成了乙個雙向鍊錶,對插入刪除結點、查詢某個結點都帶來了方便。

對二叉樹以某種次序遍歷使其變為線索二叉樹的過程稱做是線索化

空心箭頭實線為前驅,虛線黑箭頭為後繼
每個結點再增設兩個標誌域ltag和rtag,ltag和rtag只是存放0或1數字的布林型變數,占用的記憶體空間要小於像lchild和rchild的指標變數

用檔案建立一顆二叉樹

本次使用到的類有 fstream類 string類 include fstream include string 首先建立乙個txt文字 這代表了一棵二叉樹 如圖 三個符號分別對應 資料 左孩子 右孩子 存在為1,不存在為0 於是需要兩個函式。第乙個把檔案轉化為陣列,第二個把陣列轉化為二叉樹。在這裡...

驗證一顆二叉搜尋樹

給定乙個二叉樹,判斷其是否是乙個有效的二叉搜尋樹。假設乙個二叉搜尋樹具有如下特徵 節點的左子樹只包含小於當前節點的數。節點的右子樹只包含大於當前節點的數。所有左子樹和右子樹自身必須也是二叉搜尋樹。這裡有一種錯誤的思路 判斷當前節點大於左節點,小於右節點,以此遞迴下去,當不滿足上面條件就返回false...

程式設計練習之一顆二叉樹包含另一顆二叉樹

劍指offer上的一道程式設計練習,如何確定二叉樹a包含一棵相對小一點的二叉樹b?思路 用兩個函式實現,第乙個首先判斷根結點是否相等,第二個函式繼續判斷子結構是否相等 函式一 第一步,首先從根結點入手,判斷proota的值是否與prootb的根結點的值是否相等。若相等,則在比較a樹的子結構是否包含b...