我正在阅读一本关于从二进制搜索树中删除节点的书,本书中描述的过程对我来说似乎不必要。
我的问题是具体关于删除具有左子树和右子树的节点。在我看来,如果其左子树只有一个节点,则应该由其左子树中最右边的节点或其左边节点替换节点。
在第一种情况下,如果我们删除40,它将被替换为30;在第2号情况下,如果我们删除40,它将被替换35。
但在书中,它说应该从节点到删除的右子树中找到替换,这可能涉及一些复杂的操作。
我在这里遗漏了什么吗?请指出。
答案 0 :(得分:1)
你所指出的是正确的,删除的节点应该被 替换为顺序继承者,它是右子树中最左边的节点或其有序的前身,即左子树中最右边的节点。这允许正确遍历树。大多数二叉搜索树数据结构允许以任一方式执行删除,但在某些情况下,您可能希望实现删除以使树保持平衡。
Wikipedia上提供了更多详细信息和示例代码。
答案 1 :(得分:0)
如果删除节点40,则在第1种情况下,将替换为50。
如果删除节点40,则在第2种情况下,将替换为50。
所以基本上当我们删除任何有2个子节点的节点时,删除应该如下所示。 我们去了节点的正确孩子,然后是那个孩子的最左边。
下图显示了一些示例,如何从二叉搜索树中删除节点。这也取自一本书,但它清楚地解释了。