二叉搜尋樹中最複雜的操作:刪除乙個節點
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 解釋 輸入為 ...