Java 二叉树递归removeLeftmost()方法是如何工作的?
该方法的规范声称,该方法从根开始,将删除最左边的节点并修复树结构。它还表示,如果最左边的节点没有左边的子节点,则将右边的子节点(可能是Java 二叉树递归removeLeftmost()方法是如何工作的?,java,tree,binary-tree,binary-search-tree,Java,Tree,Binary Tree,Binary Search Tree,该方法的规范声称,该方法从根开始,将删除最左边的节点并修复树结构。它还表示,如果最左边的节点没有左边的子节点,则将右边的子节点(可能是null)作为左边的子节点附加到最左边节点的父节点(我看不出代码中会发生这种情况)。代码如下: public BTNode removeLeftmost() { if (left == null) return right; left = left.removeLeftmost(); return this; } 我只是
null
)作为左边的子节点附加到最左边节点的父节点(我看不出代码中会发生这种情况)。代码如下:
public BTNode removeLeftmost()
{
if (left == null)
return right;
left = left.removeLeftmost();
return this;
}
我只是不知道它是如何返回整个树的,并且返回了最左边的节点。主要是第一部分让我感到困惑,它说如果
left==null
返回右子级。如果我深入到树中(由于递归调用),返回right不会切断很多树吗?我假设这是一个二元搜索树,因为否则您不需要修复结构,对吗
它沿着树移动,直到左边没有更多的树枝,也就是说,只在左边,你已经到达了一片叶子
如果(左!=null){
left=left.removeLeftmost();
}
此时,它将子级右侧的分支移植到父级左侧树所在的位置(通过
left=left.removeeftmost();
),然后将以前位于同一位置的分支返回到树的根。下面是它处理的情况:
9
/ \
8 12
/ \
5 20
\
6
\
7
当我们到达5
时,它是最左边的节点(left==null
)。我们需要移除它。因此5
(即6
)的右侧返回给调用者(return right;
),调用者将6
作为8
的新左树(left=left.removeeftmost()
)
然后将
8
返回给调用者(返回此
),并指定为9
的左节点(left=left.removeeftmost()
)。但是8
已经是9
的左子级,所以这不会改变任何事情。当我认为该方法返回整个更新的二叉树时,我错了吗?或者这个方法是为了补充其他方法(如果它只返回树的一部分)?@user3614030:它返回整个树(或者相当于新的根节点)。这一点很重要,因为如果根节点是最左边的节点,则根节点本身可能会更改。也许我在跟踪递归时遇到了问题。当返回一个对象是递归问题时,我该怎么做?
9
/ \
8 12
/ \
6 20
\
7