1 二元查詢樹轉變成排序的雙向鍊錶

2022-08-05 14:45:13 字數 1127 閱讀 1221

它首先要是一棵二元樹,在這基礎上它或者是一棵空樹;或者是具有下列性質的二元樹:

若左子樹不空,則左子樹上所有結點的值均小於它的根結點的值;

若右子樹不空,則右子樹上所有結點的值均大於它的根結點的值; 

左、右子樹也分別為二元查詢樹

根據二元查詢樹的特點可知:節點a的左子樹的值都小於a,a的右子樹的值都大於a。

所以雙向鍊錶中,a的左邊的值為左子樹最右子樹節點的值,而a的右邊的值為右子樹最左的子樹節點的值,當然,這種分析不大適合直接寫程式,效率不高。

對於只有三個節點的二元查詢樹,很容易獲取其排序後的順序值:左節點《父節點《右節點。找到了上述的規律後,用遞迴的思想,情況就變得比較簡單了,比如對於乙個節點a,其左子樹構成的順序表為la,右子樹構成的順序表為ra,那麼a以及其子節點構成的順序表則是:la。

最後一種方法可根據樹的遍歷方法來排序的,還記得樹的三種遍歷方式(先序,中序,後續)?觀察二元查詢樹的特殊性,發現:其左節點《中節點《右節點,這個順序不是和樹的中序遍歷方式一樣?那麼可以直接套用二叉樹的中序遍歷來實現的啊!

class bstreenode

};// 二叉樹中序遍歷

void btreemid(bstreenode* r)

else

} }}

// 二叉樹中序遍歷轉雙向鍊錶

二元查詢樹轉變成排序的雙向鍊錶

描述 輸入一顆二元查詢樹,將二元查詢樹轉換成乙個排序的雙向鍊錶。要求不能建立人新建立的結點,只調整指標的指向。我的思路 利用遞迴思想進行解答。1.分解,將結點p分解成左子樹和右自樹兩個部分。2.解決子問題,左子樹變成乙個雙向鍊錶,右子樹變成乙個雙向鍊錶。3.合併,將結點p的left 連線到左子樹中最...

二元查詢樹轉變成排序的雙向鍊錶

把二元查詢樹轉變成排序的雙向鍊錶 題目 輸入一棵二元查詢樹,將該轉換成個排 序的雙向鍊錶。要求不能建立任何新的結點,只調整指標向。10 6 14 4 8 12 8 轉換成雙向鍊錶 4 6 8 10 12 14 16 利用中序遍歷來解決比較簡單,這裡我主要提供一種非遞迴版本來解決這個問題 遞迴版本 c...

1 把二元查詢樹轉變成排序的雙向鍊錶

1.把二元查詢樹轉變成排序的雙向鍊錶 題目 輸入一棵二元查詢樹,將該二元查詢樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只調整指標的指向。10 6 14 4 8 12 16 轉換成雙向鍊錶 4 6 8 10 12 14 16。首先我們定義的二元查詢樹節點的資料結構如下 struct bst...