二叉树递归removeLeftmost()方法如何工作?

时间:2014-06-13 16:04:32

标签: java tree binary-tree binary-search-tree

该方法的规范声称该方法从根开始,将删除最左边的节点并修复树结构。它还说如果最左边的节点没有左子节点将右子节点(可能为空)作为左子节点附加到最左边节点的父节点(我不知道代码中发生了这种情况)。这是代码:

public BTNode removeLeftmost()
{
    if(left == null)
        return right;
    left = left.removeLeftmost();
    return this;
}

我只是不知道返回最左边的节点是如何返回整个树的。主要是第一部分让我感到困惑,如果留下== null,它会说回到正确的孩子。如果我深入到树中(由于递归调用),不会返回右侧切断很多树?

2 个答案:

答案 0 :(得分:1)

我假设这是一个二叉搜索树,否则你不需要修复结构,对吗?

它的作用是它沿着树移动,直到左边没有更多的分支,即仅相对于左边,你已经到达了一片叶子。

if (left !=null){ left = left.removeLeftmost(); }

此时,它将子项右侧的分支移植到左侧树所在的父级上的那个位置(再次通过left = left.removeLeftmost();),然后它将返回之前位于该树中的分支。同一点一直回到树的根部。

答案 1 :(得分:0)

以下是处理的情况:

          9
         / \ 
        8   12
       / \
      5   20
       \ 
        6
         \
          7

当我们到达5时,它是最左边的节点(left == null)。我们需要删除它。因此,5(即6)的权利将返回给调用方(return right;),并且调用者将6作为8的新左侧树( left = left.removeLeftmost())..

          9
         / \
        8   12
       / \
      6   20
       \ 
        7

然后将8返回给调用者(return this),并将其指定为9left = left.removeLeftmost())的左侧节点。但是8已经是9的左子,所以这不会改变任何内容。