Here是remove
BST
方法的一种实现。我引用那里:
Removing an element from a search tree, although tricky,
is conceptually straight-forward with one (common) exception: removing the element at a
node with two non-null children. In this case, the solution is either:
removeMax: remove the maximum (rightmost) node from the left subtree
and replace the root's value with the value of the removed node.
removeMin: remove the minimum (leftmost) node from the right subtree
and replace the root's value with the value of the removed node.
In either case the search tree's order structure is preserved.
如果你看一下这个二叉树,
我想删除8
,如果我选择使用leftTree
从removeMax
中选择元素,我会根据上述定义选择7
。
但我需要使用13
从right Tree
中选择removeMin
并打破BST
。
remove
的工作方式是获取leftTree中的maximum
或来自minimum
的{{1}},并替换要删除的rightTree
node
。
答案 0 :(得分:3)
尽管视觉外观,上面右子树的最左边节点是十,而不是13.到达13需要向右移动(从十到十四),所以13不能是最左边的节点。如果选择10,则BST属性不会被破坏。
右子树有三个节点--10,14和13。
10
\
\
14
/
13
十(在顶部)没有左子树,所以它是右子树的最左边的节点。
如果10的leftnode不是
null
而是某个节点呢?
然后树看起来像这样:
10
/ \
/ \
9 14
/
13
所以最左边的节点是9,而不是10。然后,您描述的算法将选择九个进行删除,这将再次保留BST属性。
答案 1 :(得分:1)
右子树的最小值为10,而不是13。
如果您需要视觉助记符,可能会有所帮助:右子树的最小值是“正确孩子的最左侧后代。”