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

二叉搜索树是在递归插入过程中重建的吗?

邵兴文
2023-03-14

在bst的常规递归代码中,树的左右元素在每个递归调用中都设置了(Int.left=andt.right=)。这不是再次构造树吗?

存储对前一个节点的引用,然后根据值将新节点添加到左侧或右侧,不是更好吗?还是我在这里遗漏了什么?谢谢

      public Elem insert (Elem t, int toInsert)
      {
        if (t == null)
          return new Elem(toInsert,null,null);
        else {
          if (toInsert < t.value)
             t.left  = insert(t.left, toInsert);
          else
             t.right = insert(t.right,toInsert);
          return t;
        }
  }

要插入一个新元素,代码会将每个元素或子树指定为左和右。我的问题是,这不是开销吗?要插入链接列表,我们只需导航到最后一个节点并在那里执行链接。这里,我们在每次插入时对整个树执行链接。有没有其他方法可以避免这种情况?

共有1个答案

潘弘壮
2023-03-14

它不是重建树,而是通过递归调用遍历树,以到达树中的一个叶(一个空点),从而可以在那里添加新元素。例如,考虑一下这个BST,

    6
   / \
  4   8

假设你调用了insert(元素6,5)*表示我们在三个元素中的位置)。

   *6
   / \
  4   8

该方法将跳过第一个if-语句,并继续检查与方法参数中的当前元素相关的值5。5小于6,因此执行以下行,t.left=插入(t.left, toInert)(将其视为elem6.left=插入(元素4,5))。

    6
   / \
 *4   8

现在我们进入第二个方法调用insert,这次是insert(元素4,5)。再次跳过第一个if语句,并将4与5进行比较。5大于4,因此执行以下行,t.right=insert(t.right,toInsert)(将其视为elem4.right=insert(null,5))。

    6
   / \
  4   8
   \
    *

现在我们进入了第三个方法调用“insert”,这次调用了insert(null,5),因此第一个if语句被实际执行,并返回Elem类型的新对象。也就是说,执行这一行时,返回新元素(toInsert,null,null)(将其视为返回新元素(5,null,null))。

    6
   / \
  4   8
   \
    *

在这一点上,调用堆栈在增长到三个调用后开始减少。回到这一行,t.right=插入(t.right, toInsert),但不是插入(t.right, toInsert),现在是new Elem(5, null, null)。所以元素5已分配给元素4的右侧。然后,执行方法的其余部分,以返回t结尾。t在这种情况下是通过方法元素4传递的Elem

    6
   / \
 *4   8
   \
    5

回到这一行(沿着调用堆栈往下看),t.left=insert(t.left,toInsert)但是现在不是insert(t.left,toInsert),而是元素4。元素6的左边被分配给元素4。然后,执行该方法的其余部分,以return t结束t在这种情况下是通过方法元素6传递的Elem。然后,第5元素的插入就结束了。

   *6
   / \
  4   8
   \
    5
 类似资料:
  • 二叉搜索树(BST)和二叉树(BT)中的插入有什么区别?我知道,在BST中,您将新节点的值与根进行比较,如果较小,则添加到其左侧,如果较大,则将其添加到根的右侧。BT的程序是否相同?如果没有,插入和移除的步骤是什么?

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

  • 问题内容: 我想在非二叉树中搜索一个项目(任何节点都可以有n个孩子)并立即退出递归。所讨论的节点可以是任何节点,而不仅仅是叶子。 这是我的代码,但我没有完整的搜索。 nNode包含: (是孩子) 和数据对象。 问题答案: 探索第一个孩子后,您不应该退出。您不需要循环前面的语句。

  • 对于我用私有字段实现的二叉树对象 我有一个方法,它需要返回一个树,包括具有的节点和具有的节点之间的所有键及其相应值。这个方法也需要使用递归来执行。 我遇到的问题是,我无法找到一种方法来获得一个以结尾的树(可能看起来像一个LinkedList),而不包括和。我想我应该首先在根的左树或右树上递归调用方法,这取决于startKey是大于还是小于根键,所以: 这将一直在树中导航,直到到达包含键的节点。当我

  • 我搜索了一下,但没有找到这个问题的答案... 我构建了一个非二叉树,因此每个节点可以有任意数量的子节点(我认为称为n元树) 为了有助于搜索,我在构建树的时候给了每个节点一个编号,这样每个节点的子节点会更大,它右边的所有节点也会更大。 像这样的东西: 这样我就有更多的时间进行搜索 当我想插入节点时,问题就来了。如果我想在除了结尾以外的任何地方插入节点,这个模型就不起作用了。 我想了几种方法可以做到这