我试图理解为什么在删除BST树中的节点并且必须保留子节点并遵守BST结构时,您必须采用节点的正确子节点(更高的值,然后节点被删除)并且如果正确的孩子有一个左孩子带那个孩子。否则只是正确删除的节点。
为什么不直接删除节点左子节点,如果有的话。它还能正常运作吗?
或者我错过了什么。
我正在阅读this文章。
答案 0 :(得分:3)
你过分简单了。
选择替换已删除的节点的节点必须大于已删除节点左侧的所有节点,并且小于右侧的所有节点。所以它必须是左子树的最右后代或右子树的最左后代;除非一个或另一个子树完全不存在,否则我们可以完全删除一个级别的树,只需将已删除的节点替换为存在的子节点。
当两个树都存在时,文章中列出的规则将始终为您提供正确的子树的最左侧后代。如果你愿意的话,你确实可以得到一个替代规则集,它使用最左边的子树最右边的后代。
总是使用左孩子并没有“正常工作”。实际上,如果右边有一个孩子而左边的孩子本身有两个孩子,那么在没有基本上重建树的情况下甚至都做不到。
答案 1 :(得分:2)
对于您描述的特殊情况,您将是正确的。但是对于更普遍的东西,你可以比被删除的节点更深层次,你需要用一个节点替换该节点,该节点将小于右边的所有节点,并且大于左边的所有节点。举个例子:
2
/ \
1 6
/ \
4 7
\
5
假设你想移动节点6,现在按照你的指示,我们将用左子节点4替换它。现在我们如何处理节点5?我们可以把它作为节点7的左子节点(如果它存在的话,它是节点7的最左边的后代),但是当你知道删除一个叶子是微不足道的时,为什么要进行所有这些重新调整呢?只是想用另一个节点替换节点,这个节点会使左边的每个节点都保持较少,而右边的每个节点都会更大。