二叉搜尋樹

2021-09-25 13:53:55 字數 2723 閱讀 4992

基本概念

二叉搜尋樹又稱二叉排序樹,它或者是一棵空樹,或者是具有以下性質的二叉樹:

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

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

它的左右子樹也分別為二叉排序樹。

如下圖所示

二叉搜尋樹的查詢

若根節點 = 要查詢的節點 返回true

若根節點 < 要查詢的節點 ,在右子樹種查詢

若根節點 > 要查詢的節點 ,在左子樹中查詢

重複上述過程,直至查詢成功返回找到的結點,否則返回false。

二叉搜尋樹的插入

若二叉搜尋樹為空,直接插入

若二叉搜尋樹不為空,按二叉搜尋樹性質查詢插入位置,插入新節點

二叉搜尋樹的刪除

首先查詢元素是否在二叉搜尋樹中,如果不存在,則返回, 否則要刪除的結點可能分下面四種情況:

a. 要刪除的結點無孩子結點

b. 要刪除的結點只有左孩子結點

c. 要刪除的結點只有右孩子結點

d. 要刪除的結點有左、右孩子結點

看起來有待刪除節點有4中情況,實際情況a可以與情況b或者c合併起來,因此真正的刪除過程如下:

情況b:刪除該結點且使被刪除節點的雙親結點指向被刪除節點的左孩子結點

情況c:刪除該結點且使被刪除節點的雙親結點指向被刪除結點的右孩子結點

情況d:在它的右子樹中尋找中序下的第乙個結點(關鍵碼最小),用它的值填補到被刪除節點中,再來處理該結點的刪除問題

二叉搜尋樹的實現

//實現簡易版的二叉搜尋樹

// 插入 查詢 刪除

#include

using namespace std;

template

class bstreenode

public:

pair _kv;

bstreenode

* left;

bstreenode

* right;};

template

class bstree

//插入

bool insert

(const pair kv)

node* parent = nullptr;

node* cur = _root;

while

(cur)

else

if(cur->_kv.first > kv.first)

else

} cur = new node

(kv);if

(parent->_kv.first < kv.first)

else

return true;

}//查詢

node*

find

(const k& key)

else

if(cur->_kv.first > key)

else

}return nullptr;

}//刪除

bool remove

(const k& key)

else

if(cur->_kv.first > key)

else

else

else}}

//只有左孩子

else

if(cur->right == nullptr)

else

}//左右孩子都有

else

cur->_kv = replace->_kv;

//替換節點值

del = replace;

if(reparent->left == replace)

else

} delete del;

return true;}}

return false;

}//中序遍歷

void

inorder()

void

_inorder

(node* root)

private:

node* _root;};

void

testbstree1()

intmain

(void

)

二叉搜尋樹效能分析我們可以看出來其實它就是乙個二分查詢,所以bst的查詢和插入刪除關鍵字的速度較於一般的陣列鍊錶都比較快。這就是bst產生的原因。但是,建立好bst後,插入資料的隨機性,所以會出現比較極端的bst。

最優情況下,二叉搜尋樹為完全二叉樹,其時間複雜度為:log(n)

最差情況下,二叉搜尋樹退化為單支樹,其時間複雜度為:o(n)

第一張圖的就是我們理想的情況,可是卻可能出現第二張圖的情況,第一張圖操作的時間複雜度為log(n),而第二張圖則為o(n),所以這也是bst沒有廣泛使用的原因。

二叉搜尋樹 二叉搜尋樹

題目 二叉搜尋樹 time limit 2000 1000 ms j a others memory limit 32768 32768 k j a others total submission s 6945 accepted submission s 3077 problem descripti...

二叉搜尋樹 修剪二叉搜尋樹

第一反應是重構,看來別人的解答發現,其實不用重構那麼複雜。treenode trimbst treenode root,int low,int high if root val high 下一層處理完左子樹的結果賦給root left,處理完右子樹的結果賦給root right。root left ...

樹 二叉樹 二叉搜尋樹

給定乙個二叉樹,判斷其是否是乙個有效的二叉搜尋樹。假設乙個二叉搜尋樹具有如下特徵 節點的左子樹只包含小於當前節點的數。節點的右子樹只包含大於當前節點的數。所有左子樹和右子樹自身必須也是二叉搜尋樹。示例 1 輸入 2 13輸出 true 示例 2 輸入 5 14 3 6輸出 false 解釋 輸入為 ...