繁体   English   中英

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

[英]How does binary tree recursive removeLeftmost() method work?

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

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

    left = left.removeLeftmost();
    return this;
}

我只是不明白它是如何用最左边的节点返回整棵树的。 主要是第一部分让我感到困惑,它说如果left == null则返回右孩子。 如果我深入到树中(由于递归调用),返回时会不会切断很多树?

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

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

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

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

这是它处理的情况:

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

当我们到达5 ,它是最左边的节点( left == null )。 我们需要删除它。 这样的权5 (即6 )被返回给调用者( return right; ),和呼叫方使6的新的左树8left = left.removeLeftmost() )..

          9
         / \
        8   12
       / \
      6   20
       \ 
        7

然后8返回给调用者( return this )并分配为9的左节点( left = left.removeLeftmost() )。 但是8已经是9的左孩子,所以这不会改变任何东西。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM