该方法的规范声称该方法从根开始,将删除最左边的节点并修复树结构。它还说如果最左边的节点没有左子节点将右子节点(可能为空)作为左子节点附加到最左边节点的父节点(我不知道代码中发生了这种情况)。这是代码:
public BTNode removeLeftmost()
{
if(left == null)
return right;
left = left.removeLeftmost();
return this;
}
我只是不知道返回最左边的节点是如何返回整个树的。主要是第一部分让我感到困惑,如果留下== null,它会说回到正确的孩子。如果我深入到树中(由于递归调用),不会返回右侧切断很多树?
答案 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
),并将其指定为9
(left = left.removeLeftmost()
)的左侧节点。但是8
已经是9
的左子,所以这不会改变任何内容。