二叉搜尋樹

2021-10-08 06:28:46 字數 2493 閱讀 5388

二叉搜尋樹中最複雜的操作:刪除乙個節點

1.刪除二叉搜尋樹中的最小節點:一直向左子樹遍歷,直到遍歷到某個節點的左子樹為空時,說明該節點就是整個二叉搜尋樹的最小節點。如果該節點還有右子樹,直接把右子樹放到應被刪除的節點上就可以了。

2.刪除二叉搜尋樹中的最大節點:一直向右子樹遍歷,直到遍歷到某個節點的右子樹為空時,說明該節點就是整個二叉搜尋樹的最大節點。如果該節點還有左子樹,直接把左子樹放到應被刪除的節點上就可以了。

3.如果要刪除的節點只有乙個孩子,或左子樹或右子樹,那麼操作都是簡單的,和上面類似。

4.刪除任意節點(既有左孩子又有右孩子):用該節點右子樹中的最小節點(也就是該節點的後繼節點)替換要刪除的節點即可。為什麼?因為該節點的右子樹中任意節點都一定是比左子樹大的,同時又為了滿足二叉搜尋樹右子樹的節點大於當前結點的性質,選取要刪除節點右子樹中的最小節點替換該節點即可。

當然,使用前驅節點(左子樹中的最大節點)代替要刪除的節點也是可以的!

template

<

typename key,

typename value>

class

bst;

node

(key key, value value)

node *root;

int count;

public

:bst()

~bst()

intsize()

bool

isempty()

void

insert

(key key, value value)

bool

contain

(key key)

value*

search

(key key)

void

destroy

(node* node)

} key minimum()

key maximum()

void

removemin()

void

remove

(key key)

private

://向node為根的二叉搜尋樹中插入(key,value),返回插入新節點後的二叉搜尋樹的根

node*

insert

(node *node, key key, value value)

if(key == node-

>key)

node-

>value = value;

else

if(key < node-

>key)

node-

>left =

insert

(node-

>left, key, value)

;else

node-

>right =

insert

(node-

>right, key, value)

;return node;

}bool

contain

(node* node, key key)

//在以node為根的二叉搜尋樹中查詢key所對應的value

value*

search

(node* node, key key)

node*

minimum

(node* node)

node*

maximum

(node* node)

//刪掉以node為根的二分搜尋樹中的最小節點,返回刪除後新的二分搜尋樹的根

node*

removemin

(node* node)

node-

>left =

removemin

(node-

>left)

;return node;

} node*

remove

(node* node, key key)

else

if(key > node-

>key)

else

//key == node->key

if(node-

>right ==

null

)//node->left!=null && node->right!=null

node *successor =

newnode

(minimum

(node-

>right));

successor-

>left =

removemin

(node-

>right)

; successor-

>left = node-

>left;

delete node;

count--

;return successor;}}

};

二叉搜尋樹 二叉搜尋樹

題目 二叉搜尋樹 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 解釋 輸入為 ...