左高樹的定義:
設x是擴充二叉樹的乙個結點,並令left_child(x)和right_child(x)分別表示內部結點的左、右兒子。定義shortest(x)為從x到乙個外部結點的最短路程長度。
令s (x)為從節點x到它的子樹的外部節點的所有路徑中最短的一條,根據s(x)的定義可知,
若x是外部節點,則s的值為0,若x為內部節點,則它的s值是:
其中l與r分別為x的左右孩子。
左高樹是一棵二叉樹,且如果該二叉樹不空,則對其中的每個內部結點x,都有:
shortest(left_child(x))>= shortest(right_child(x))。
一棵二叉樹稱為高度優先左高樹,當且僅當其中任何乙個內部節點的左孩子的s值都大於或等於右孩子的s值。如果一顆hblt同時還是大根樹,則稱為最大hblt。如果一棵hblt同時還是小根樹,則成為最小hblt。
一棵二叉樹稱為重量優先左高樹,當且僅當其中任何乙個內部節點的左孩子的w值都大於或等於右孩子的w值。(若x是內部節點,則他的重量是其孩子節點的重量之和加1).
最大hblt的插入:最大hblt的插入操作可利用最大hblt的合併操作來實現,假定將元素x插入名為h的最大hblt中。如果構建一棵僅有乙個元素x的最大hblt,然後將其與h進行合併,那麼合併之後的最大hblt將包括h的全部元素和元素x.。因此,要插入乙個元素,可以先建立一棵新的只包含這個元素的hblt,然後將這棵hblt與原來的hblt進行合併。
最大hblt的刪除:最大元素在根中。如果根本刪除,則剩下左右孩子,然後以左右孩子為最大hblt進行合併,便是刪除後的結果。
兩棵最大hblt的合併(左高樹中最重要的操作):合併策略最好採用遞迴來實現。令a、b為需要合併的兩棵最大hblt。若乙個為空,則另乙個便是合併後的結果。假設兩者均不為空,為實現合併,先比較兩個根元素,較大者作為合併後的根。假定a的根比較大,且左子樹為l。令c是a的右子樹與b合併而成的hblt。a與b合併的結果是以a為根,以l和c為子樹的最大hblt。如果l的s值小於c的s值,則c為左子樹,l為右子樹。以下是合併兩棵左高樹的c++函式meld。該函式首先處理特殊情況:要合併的兩棵樹至少有一棵樹為空。當兩棵樹都不為空時,要確保x的根元素大於y的根元素,否則x與y進行交換。接下來,通過遞迴,要將x的右子樹與y進行合併。合併後,為保證結果是最大的hblt,x的左右孩子可能需要交換,這時候需要計算s值。
templatevoid maxhblt::meld(binarytreenode> * &x, binarytreenode> * &y)
//x和y均不為空,必要時交換x,y
if(x->element < y->element)
//將x的右子樹與y進行合併
meld(x->rightchild,y);
//為保證結果是最大hblt,需要計算子樹的s值大小
if(x->leftchild == null)
else
}
最大hblt的初始化:初始化過程是將n個元素逐個插入最初為空的最大hblt中,所需的時間為
templatevoid maxhblt::initialize(t* theelements, int thesize)
//從佇列中重複取出兩棵樹進行合併
for(int i=1;i<=thesize-1;i++)
if(thesize>0)
root = q.front();
treesize = thesize;
}
其他方法:說明:在一棵最大hblt中,節點的資料型別是binarytreenode>;pair的第乙個成員是節點的s值,第二個成員是優先順序佇列元素。
templatevoid maxhblt::meld(maxhblt& thehblt )
templatevoid maxhblt::push(const t& theelement )
templatevoid maxhblt::pop()
資料結構與演算法 樹
後序遍歷 已知前序和中序求後序 設計 的原則 1 有且僅有乙個根節點 2 所有的子樹也滿足該要求 子樹之間不能有交集 單個節點也是一棵樹 空樹 啥資料都沒有,沒有任何節點 根節點 父節點,子節點,兄弟節點 如果兩個節點的父節點雖不相同,但是它們的父節點處在同一層次上,那麼這兩個節點是兄弟節點 葉子節...
演算法與資料結構 樹
搜尋 如上圖所示 圓圈代表結點,連線結點的線代表邊。樹由結點和連線結點的邊組成。2 有根結點的父子關係 如圖根結點為0,連線根結點0到結點4最後一條邊連線著結點1和4,則結點1稱為結點4的父節點,結點4 為結點1 的子節點。結點2,3為結點4的兄弟結點。3 根結點 沒有父節點的結點 唯一 外部結點 ...
資料結構與演算法(樹)
1 樹的定義 2 基本術語 3 樹的性質 1 二叉樹定義及特性 2 二叉樹的儲存結構 1 二叉樹遍歷 1 樹的儲存結構 2 樹 森林 二叉樹的轉換 樹轉換為二叉樹的規則 每個節點左指標指向它的第乙個孩子,右指標指向它在樹種的相鄰右兄弟。根節點沒有兄弟,所以對應二叉樹沒有右子樹。樹轉換為二叉樹的方法 ...