二叉查詢樹

2021-06-28 23:42:56 字數 924 閱讀 2976

二叉查詢樹是所有結點的左孩子都不大於該結點,右孩子都不小於該結點的二叉樹,這裡介紹一下相關的操作和時間複雜度

按順序遍歷

基於上面介紹的二叉查詢樹的特點,很容易看出來只要對樹進行中序遍歷,即先左子樹,再根結點,最後右子樹的順序輸出,就能得到由小到大排序的結點列表。

遍歷所需時間為o(n)

查詢二叉查詢樹

還是基於二叉查詢樹的特性,要查詢key值的元素,首先比較它和根結點的大小,如果正好等於根結點的值,那麼直接就找到了,如果比根結點的值小的話,就遞迴左子樹查詢,否則遞迴右子樹,實在找不到就返回乙個找不到的下標就好了。

根據以上思路,可以得出,不管有沒有找到,最壞的情況就是由上而下地走完樹的高度,所以該操作所用時間為o(樹的高度)

查詢最大/最小元素

最大元素即右子樹最右邊的結點,最小的元素即左子樹最左邊的結點

同上,演算法的執行時間最多就是走完樹的高度,所以執行時間也是o(樹的高度)

查詢前驅和後繼元素

這個個人看法和《演算法導論》中的有些不同,待確認後再補上

插入元素

首先和根元素比較,如果比根元素小的話,則考慮插在跟元素的左子樹下,如果比根元素大的話,則考慮插在跟元素的右子樹下,如果相等的話就無所謂了,哪邊都行,這樣遞迴下去直至想要插入的位置為空,那麼就插在那裡就ok了

執行時間o(樹的高度)

刪除元素

這裡要分三種情況:

*要刪除的結點沒有孩子:如果該結點有父節點的話就刪除要刪除的結點,然後在該父節點那將該結點原本的位置指標置為空就好

*要刪除的結點只有乙個孩子:要讓該結點的孩子頂替它之前的位置

*要刪除的結點有兩個孩子:刪除該結點的後繼結點y(該結點一定至多有乙個子女,所以這一步可使用上面那種情況的方法),然後,用y的關鍵字值替換掉z的關鍵字

執行時間o(樹的高度)

二叉樹 二叉查詢樹

構建二叉樹,判斷是否為二叉查詢樹,遞迴先序遍歷,非遞迴中序遍歷 include include include include using namespace std 二叉樹結點 struct treenode 鍊錶結點 struct listnode struct tempnodetempnode...

二叉樹 二叉查詢樹

二叉樹 binary tree 一種樹型結構,每個節點最多擁有兩個節點。如下圖 幾種型別的二叉樹 1.full binary tree 每個節點的孩子數 是 0 或者 2.對高度沒有要求。如下圖 2.perfect binary tree 這個就是最完美的樹,顧名思義,所有葉子節點都有相同的深度,並...

樹(樹,二叉樹,二叉查詢樹)

1.定義 n n 0 個結點構成的有限集合。當n 0時,稱為空樹 2.對於任一棵非空樹 n 0 它具備以下性質 1 樹中有乙個稱為 根 root 的特殊結點,用 r 表示 2 其餘結點可分為m m 0 個互不相交的有限集t1,t2,其中每個集合本身又是一棵樹,稱為原來樹的子樹。3.樹的一些性質 1 ...