C 二叉搜索树中节点的删除
我有一个BST,看起来像这样: 我正在尝试删除节点12(它有两个子节点), 我想知道我是否正确地移除了它 搬迁前C 二叉搜索树中节点的删除,c,algorithm,tree,C,Algorithm,Tree,我有一个BST,看起来像这样: 我正在尝试删除节点12(它有两个子节点), 我想知道我是否正确地移除了它 搬迁前 12 _/ \_ 5 18 / \ / \ = = 15 19 2 9 / \ 13 17 拆除后: 18 _/ \_ 5 19
12
_/ \_
5 18
/ \ / \
= = 15 19
2 9 / \
13 17
拆除后:
18
_/ \_
5 19
/ \ /
= = 15
2 9 / \
13 17
我在这里的实现正确吗?
谢谢
删除后更新的编辑:
13
_/ \_
5 18
/ \ / \
= = 15 19
2 9 \
17
让我们举一个简单的例子 以这棵树为例:
A
/ \
B C
要删除,请执行以下操作:
- 如果选择B作为A的替换,则需要将C钩住B作为其最左侧的新子节点
- 如果选择C作为A的替换,则需要将B作为其最右边的新子节点连接到C中
B
\
...
\
C
C
/
...
/
B
如果您先选择C,您将得到以下结果:
B
\
...
\
C
C
/
...
/
B
回到你的树上,它是这样开始的:
12
/ \
5 18
/ \ / \
2 9 15 19
/ \
13 17
要删除12个,并选择18个来替换它,请首先升级18个:
5 18
/ \ / \
2 9 15 19
/ \
13 17
然后,因为在我前面的示例中,18对应于C,所以需要将5作为最左边的子树钩住18,从而得到最后一棵树:
18
/ \
15 19
/ \
13 17
/
5
/ \
2 9
让我们看看如果我们选择5来代替12,会发生什么:
宣传5:
5 18
/ \ / \
2 9 15 19
/ \
13 17
然后将18挂接到5中,作为其最右边的新子树:
5
/ \
2 9
\
18
/ \
15 19
/ \
13 17
两者都可以。可能还有一些关于的信息值得一读。二叉搜索树的属性是什么?他们还支持你的新树吗?你应该能自己回答这个问题。我相信他们能回答,但我想确认我为什么要问。二叉搜索树的属性是什么?该树还满足二叉搜索树属性,即每个节点中的键必须大于左子树中存储的所有键,并且比右子树中的所有关键点都小。(叶(最终节点)树的每个部分都不包含键,也没有结构来区分它们。好的,那么18比它的右子树中的所有节点都小吗?嗯,我得到树的方式是,我查看12的右子树,发现值刚好大于12,所以13。然后12变为13,现在我有一个没有子节点的节点13(在底部)因此,我可以自己删除重复项,从而得到这棵树。如果13有一个正确的孩子呢?不管你采取什么方法,你都应该为你的树代码编写单元测试。提出许多树示例,删除哪些节点,然后编写代码来验证树的完整性。无需将确切的方法硬编码到单元测试中t你可以编写一个标准化的测试方法,创建一个列表,列出所有的值,并验证列表是否仍然排序,并且它是否只缺少你删除的节点中的值。然后我将应用一个节点有一个子节点的情况,因此删除底部的重复13,并将点13的父节点删除到正确的子节点?