二进制搜索树 - 节点删除

时间:2010-01-17 15:28:33

标签: algorithm language-agnostic binary-tree

我试图理解为什么在删除BST树中的节点并且必须保留子节点并遵守BST结构时,您必须采用节点的正确子节点(更高的值,然后节点被删除)并且如果正确的孩子有一个左孩子带那个孩子。否则只是正确删除的节点。

为什么不直接删除节点左子节点,如果有的话。它还能正常运作吗?

或者我错过了什么。

我正在阅读this文章。

2 个答案:

答案 0 :(得分:3)

你过分简单了。

选择替换已删除的节点的节点必须大于已删除节点左侧的所有节点,并且小于右侧的所有节点。所以它必须是左子树的最右后代或右子树的最左后代;除非一个或另一个子树完全不存在,否则我们可以完全删除一个级别的树,只需将已删除的节点替换为存在的子节点。

当两个树都存在时,文章中列出的规则将始终为您提供正确的子树的最左侧后代。如果你愿意的话,你确实可以得到一个替代规则集,它使用最左边的子树最右边的后代。

总是使用左孩子并没有“正常工作”。实际上,如果右边有一个孩子而左边的孩子本身有两个孩子,那么在没有基本上重建树的情况下甚至都做不到。

答案 1 :(得分:2)

对于您描述的特殊情况,您将是正确的。但是对于更普遍的东西,你可以比被删除的节点更深层次,你需要用一个节点替换该节点,该节点将小于右边的所有节点,并且大于左边的所有节点。举个例子:

   2
 /  \
1    6
    / \
   4   7
    \
     5  

假设你想移动节点6,现在按照你的指示,我们将用左子节点4替换它。现在我们如何处理节点5?我们可以把它作为节点7的左子节点(如果它存在的话,它是节点7的最左边的后代),但是当你知道删除一个叶子是微不足道的时,为什么要进行所有这些重新调整呢?只是想用另一个节点替换节点,这个节点会使左边的每个节点都保持较少,而右边的每个节点都会更大。