[英]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
的新的左树8
( left = 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.