Algorithm 二叉树删除
我有一个二叉树,和预序遍历。 这是我的树Algorithm 二叉树删除,algorithm,binary-tree,Algorithm,Binary Tree,我有一个二叉树,和预序遍历。 这是我的树 15 / \ 10 23 /\ /\ 5 12 20 30 / / 11 25 \ 27 所以预购的结果是:1510121230302527。没关系 然后我删除了5、12和23个元素 我应该买这个吗 15 / \ 10 27 \ /\ 11 20
15
/ \
10 23
/\ /\
5 12 20 30
/ /
11 25
\
27
所以预购的结果是:1510121230302527。没关系
然后我删除了5、12和23个元素
我应该买这个吗
15
/ \
10 27
\ /\
11 20 30
\
25
结果:15112703025
还是这个
15
/ \
10 25
\ /\
11 20 30
/
27
结果:15112503027
另外,我有第二个病例。如果不正确,删除有什么错
UPD:那么第二个更新的变量是正确的?如果您希望其余元素的预排序遍历与删除之前的预排序遍历一致,那么您的树应该如下所示:
15
/ \
10 20
\ \
11 30
/
25
\
27
删除方法是:
如果存在已删除节点的左子树,请将左子树的根移动到已删除位置。跟随(以前的)左子树中的右子树链接,并将右子树附加到第一个空的右链接。如果没有左子树,请将右子树的根移动到删除位置。您的第二个案例几乎正确。27将是30的左节点。删除(子)树的顶部节点时,可以将该节点替换为左分支的最右侧节点或右分支的最左侧节点。在本例中,您已将30替换为右分支最左边的值,即25。您必须递归地执行此操作,因为25有自己的分支。一旦要删除的目标节点成为叶子,请将其删除 第一步:
15
/ \
10 25
\ /\
11 20 30
/
23
\
27
第二步:
15
/ \
10 25
\ /\
11 20 30
/
27
/
23
第三(删除):
完全依赖于树实现,尤其是删除实现。这意味着没有单一的答案,或者更重要的是,这两个答案都可能是正确的。此外,根据您的实现,它甚至可能不仅取决于树的初始状态,还取决于到达该点的插入/删除顺序。@Nikita:为什么要进行预顺序遍历?对于搜索树,你通常会按顺序遍历。它只是一棵二叉树还是(应该是)一棵二叉搜索树?我只需要实现预排序,没有特殊目的。那么,任何保留未删除元素的东西都可以。
15
/ \
10 25
\ /\
11 20 30
/
27