在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;
}
}
要插入一个新元素,代码会将每个元素或子树指定为左和右。我的问题是,这不是开销吗?要插入链接列表,我们只需导航到最后一个节点并在那里执行链接。这里,我们在每次插入时对整个树执行链接。有没有其他方法可以避免这种情况?
它不是重建树,而是通过递归调用遍历树,以到达树中的一个叶(一个空点),从而可以在那里添加新元素。例如,考虑一下这个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元树) 为了有助于搜索,我在构建树的时候给了每个节点一个编号,这样每个节点的子节点会更大,它右边的所有节点也会更大。 像这样的东西: 这样我就有更多的时间进行搜索 当我想插入节点时,问题就来了。如果我想在除了结尾以外的任何地方插入节点,这个模型就不起作用了。 我想了几种方法可以做到这