当前位置: 首页 > 知识库问答 >
问题:

二叉树递归removeReftMost()方法是如何工作的?

李光华
2023-03-14

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

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

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

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

共有1个答案

李俭
2023-03-14

下面是它正在处理的情况:

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

当我们到达5时,它是最左边的节点(left==null)。我们需要移除它。因此5的右侧(即6)返回给调用方(Return right;),调用方使6成为8的新左树(left=left.removeReftMost())。

          9
         / \
        8   12
       / \
      6   20
       \ 
        7

然后8返回给调用方(Return this)并分配为9的左节点(left=left.RemoveReftMost())。但是8已经是9的左子级,所以这不会改变任何事情。

 类似资料:
  • 用递归方式遍历二叉树 思路说明 遍历二叉树的方法有广度优先和深度优先两类,下面阐述的是深度优先。 以下图的二叉树为例: 先定义三个符号标记: 访问结点本身(N) 遍历该结点的左子树(L) 遍历该结点的右子树(R) 有四种方式: 前序遍历(PreorderTraversal,NLR):先访问根结点,然后遍历其左右子树 中序遍历(InorderTraversal,LNR):先访问左子树,然后访问根节点

  • 我试图理解二叉树遍历(PreOrder)的实现。非递归方法很好,但我在试图理解递归方法时完全迷失了方向。 代码: 二叉树 我的理解是,当到达节点2(8-4-2)时,节点2的左边没有。所以条件将失败。 下面是我的问题。 点头之后。左无,右无。右边是横穿的?(因为如果启动:条件失败) 在节点1之后,逻辑如何移动到节点5哪个根节点。对吧? 我对递归的理解很差,请帮助!

  • 首先,这是家庭作业,所以把它放在外面。 我应该用特定的方法实现二叉查找树: void insert(字符串)、boolean remove(字符串)和boolean find(字符串)。 我已经能够成功地编程和测试插入,并找到方法,但我有困难与删除。 我的程序中发生的事情是,删除实际上并没有从树中删除任何东西,我相信这是因为它只引用当前节点的本地创建,但我可能错了。我认为我可以实现我需要测试的不同

  • 好的,我必须创建一个递归方法来计算树中的节点,我做到了(变量名是葡萄牙语的,对不起): arvbin是二叉树,esq和dir是对树分支的左右引用。 我以为这会奏效,但由于某种原因,当我尝试运行它时,它返回0。我使用了一些调试,我认为问题在于,当方法完成并返回到原始的非递归方法时,cardinalidade变量被设置为0。我不确定这是否是因为自动装箱会弄乱我的整数并将其转换为int,然后当我调用该方

  • 我试图为我的BST做一个递归加法。public add方法接受一个int参数,private方法接受相同的int和一个节点。这是我目前掌握的代码 我经常得到空指针,也尝试过调试,但我的逻辑中有一些我看不到的缺陷。

  • 主要方法: 如果您需要类'BinaryNode',请询问,我会张贴它,我不想用代码交换这个问题... 输入: null null 我不明白为什么节点'2'和'3'返回时左值和右值为null。