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

删除Java中二叉搜索树的方法实现?,java,algorithm,binary-search-tree,Java,Algorithm,Binary Search Tree,是BST的remove方法的一个实现。我在这里引用: 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:

是BST的remove方法的一个实现。我在这里引用:

 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

但我需要使用removeMin从右树中选择13,这会破坏BST

我理解得不对吗


remove的工作方式是从leftTree获取最大值或从rightTree获取最小值,并用其数据替换要删除的节点。

从右侧子树获取的最小值是10,而不是13


如果你需要一个视觉助记符,这可能会有所帮助:右子树的最小值是右子树最左边的后代。

右子树的最小值是10,而不是13


如果你需要视觉助记符,这可能会有所帮助:右子树的最小值是右子树最左边的子代。

尽管有视觉效果,但上面右子树最左边的节点是10,而不是13。达到13需要从10向右移动到14,因此13不能是最左边的节点。如果选择10,则不会破坏BST属性

右子树有三个节点-10、14和13

   10
     \
      \
       14
      /
     13
顶部的十没有左子树,因此它是右子树最左边的节点

如果10的leftnode不是null而是某个节点呢

然后,这棵树会像这样:

   10
  /  \
 /    \
9      14
      /
     13

所以最左边的节点是9个,而不是10个。然后,您描述的算法将选择9个进行删除,这将再次保留BST属性。

尽管外观如此,但上面右子树的最左侧节点是10个,而不是13个。达到13需要从10向右移动到14,因此13不能是最左边的节点。如果选择10,则不会破坏BST属性

右子树有三个节点-10、14和13

   10
     \
      \
       14
      /
     13
顶部的十没有左子树,因此它是右子树最左边的节点

如果10的leftnode不是null而是某个节点呢

然后,这棵树会像这样:

   10
  /  \
 /    \
9      14
      /
     13

所以最左边的节点是9个,而不是10个。然后,您描述的算法将选择9个进行删除,这将再次保留BST属性。

您认为它为什么会破坏BST?@EJP:根据上面的removeMin定义,我需要删除右子树最左边的节点,我认为它是13,但显然它不是来自下面的答案,我不知道为什么会,为什么你认为它会破坏BST?@EJP:根据上面的removeMin定义,我需要删除右子树最左边的节点,我认为它是13,但显然它不是来自下面的答案,我不知道为什么yetwhy 13不能是左节点…我感到困惑了?@user1988876,因为10<13。10的左子树是空的,只有右子树subtree@user1988876对的这就是为什么它是最左边的——要到达最左边的节点,从顶部开始,然后在可以的时候向左走。一旦你不能再向左走,你就到达了最左边的节点。对于所讨论的子树,将立即到达不能再向左移动的状态,因此最左边的节点是十。请注意,最左边的节点不一定是叶节点-它可能在右边有子节点。如果10的左节点不是null,但是某个节点怎么办?为什么13不能是左节点…我很困惑?@user1988876,因为10<13。10的左子树只是null,它只有右节点subtree@user1988876对的这就是为什么它是最左边的——要到达最左边的节点,从顶部开始,然后在可以的时候向左走。一旦你不能再向左走,你就到达了最左边的节点。对于所讨论的子树,将立即到达不能再向左移动的状态,因此最左边的节点是十。请注意,最左侧的节点不一定是叶节点-它可能在右侧有子节点。如果10的leftnode不是null,而是某个nodeOkay,该怎么办。您需要8的整个右子树中的最小值。从这棵子树的顶端开始。这是包含10的节点。好的,所有小于10的数字都在10的左边。但是没有,所以最少10个!现在,如果还有10岁的孩子,也许是9岁和8.5岁的孩子,那么你可以通过尽可能地从左往下描述来找到他们。所以我们说的是右边孩子最左边的后代。它可能是正确的孩子,在你的情况下,是这样的。好吧,就是这样。您需要8的整个右子树中的最小值。从这棵子树的顶端开始。这是包含10的节点。好的,所有小于10的数字都在10的左边。但是没有,所以最少10个!现在,如果还有10岁的孩子,也许是9岁和8.5岁的孩子,那么你可以通过尽可能地从左往下描述来找到他们。所以我们 y是右边孩子最左边的后代。它可能是正确的孩子本身,在你的情况下,它就是。