删除Java中二进制搜索树的方法实现?

时间:2014-01-04 04:13:38

标签: java algorithm binary-search-tree

Hereremove 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. 

如果你看一下这个二叉树,enter image description here

我想删除8,如果我选择使用leftTreeremoveMax中选择元素,我会根据上述定义选择7

但我需要使用13right Tree中选择removeMin并打破BST

我不正确理解这个吗?

remove的工作方式是获取leftTree中的maximum或来自minimum的{​​{1}},并替换要删除的rightTree node

2 个答案:

答案 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。

如果您需要视觉助记符,可能会有所帮助:右子树的最小值是“正确孩子的最左侧后代。”