2011-11-06 89 views
2

我有一棵二叉树,并且预遍遍历。 这是我的树。二叉树删除

 15 
    /\ 
    10 23 
    /\ /\ 
    5 12 20 30 
    / /
    11 25 
      \ 
      27 

预购这样的结果是:15 10 10 12 11 23 20 30 25 27,比我删除5,12和23个要素

这是确定的

我应该得到这个

  15 
     /\ 
     10 27 
     \ /\ 
     11 20 30 
       \ 
       25 

结果:15 10 11 27 20 30 25

或该?

 15 
    /\ 
    10 25 
    \ /\ 
    11 20 30 
     /
     27 

结果:15 10 11 25 20 30 27

P.S我得到的第二种情况。如果不正确,删除有什么问题?

UPD:所以第二个更新的变体是正确的?

+0

+1整齐呈现。 – Mahesh

+0

完全依赖于您的树实现,特别是您的删除实现。这意味着没有单一的答案,或者更重要的是,两者都有可能是正确的。而且,根据您的实现,它甚至可能不仅取决于树的初始状态,而且取决于插入/删除导致该点的顺序。 – davin

+0

@Nikita:你为什么要做预购遍历?对于搜索树,您通常会进行“按序”遍历。 – yairchu

回答

1

你的第二个案例几​​乎是正确的。 27将是左侧节点30.当删除(子)树的顶部节点时,可以用左侧分支的最右侧节点或右侧分支的最左侧节点替换该节点。在这种情况下,你用右分支的最左边值25替换了30,你必须递归地执行这个操作,因为25有自己的分支。一旦你的目标节点删除成为一个叶子,删除它。

第一步:

 15 
    /\ 
    10 25 
    \ /\ 
    11 20 30 
     /
     23 
      \ 
      27 

第二步:

 15 
    /\ 
    10 25 
    \ /\ 
    11 20 30 
     /
     27 
     /
     23  

三(删除):

 15 
    /\ 
    10 25 
    \ /\ 
    11 20 30 
     /
     27 
0

如果你想在剩余的元素的前序遍历为与删除前的前序遍历一致的,那么你的树应该是这样的:

15 
/\ 
10 20 
\ \ 
11 30 
    /
     25 
     \ 
     27 

删除方法是:

如果存在已删除节点的左子树,请将左子树的根移动到已删除的位置。按照(以前)左侧子树中的右侧子树链接并将右侧子树连接到第一个空白右侧链接。如果没有左子树,则将右子树的根移到删除的位置。