我正在阅读一本书,该书解释了如何从二叉搜索树中删除节点,基本上如果我们有这棵树:
10
/ \
4 100
/ \
1 8
/ \
6 9
\
7
我们要删除节点4,书中说我应该:
因此我们得到了
10
/ \
6 100
/ \
1 8
/ \
7 9
但是我想到了另一种方法:
因此我们得到了
10
/ \
8 100
/ \
6 9
/ \
1 7
现在我想问一下:我看到我的解决方案产生了(至少在这种情况下)一个稍微不平衡的树。
为什么我应该使用我的书而不是我自己的书呢?我的解决方案似乎更容易(至少从我的角度来看)实施,但我更喜欢别人指出我是不是错了。
答案 0 :(得分:2)
这两种方法的代码都不是特别复杂。
您的方法通常会产生一个不太平衡的树,因为您正在采用子树(1
的子树)并将其(可能)移动到树下很远的地方。
通过他们的方法,7
的子树向上移动1个节点,没有其他子树移动。
可能只是因为他们没有考虑过你的方法,或者,如果他们有,他们可能会选择他们的方法,因为树的平衡性越差,对它的查询性能越差
虽然这个讨论并不是特别重要,但由于基本的二元搜索树在实践中很少使用 - 而是使用self-balancing ones(由于试图维护某些属性,可以使用更强大的参数)保持树平衡。
答案 1 :(得分:0)
当树木不平衡时,穿越树木的时间会增加,因此您将失去使用BST的一些好处。