所以我正在努力实现二叉树的插入方法。
据我所知,问题是函数参数中的更改不能正确返回到main()。
static void addChild(Child c, Child tree){
if(tree==null){
tree=c;
}
else{
if(c.cid>tree.cid){
addChild(c, tree.lc);
}
else if(c.cid<tree.cid){
addChild(c, tree.rc);
}
}
}
上面看到的子对象与树中节点的子对象无关。
树节点是子对象。
CID是子类中保存整数的字段。
rc是节点的正确子级。
lc是节点的左子节点。
addChild的参数:
@param Child c:要插入到树中的子级
@param子树:树的根
基本上我的问题是,这不应该正常工作吗?当方法完成时,参数中给出的树的右子级和左子级为null。
您的递归基本情况:
tree = c;
不会更新树。它只是在该调用范围中重新分配树参数的引用。它在特定的递归调用(堆栈帧)之外没有效果。
以下是处决的演练:
Child tree = new Child();
tree.cid = 0;
tree.lc = new Child();
tree.lc.cid = 1;
Child c = new Child();
c.cid = 2;
addChild(c, tree);
// tree != null
// c.cid>tree.cid
addTree(c, tree.lc);
// tree != null
// c.cid>tree.cid
addTree(c, tree.lc);
// tree == null
tree = c; // Won't be effective
return;
return;
这会局部地改变树引用,并且在这个递归调用之外没有任何影响。
这里的技巧是在这一点上更新父树的左或右子树。
static Child addChild(Child c, Child tree){
if(tree==null){
return c;
}
else{
if(c.cid>tree.cid){
tree.lc = addChild(c, tree.lc);
}
else if(c.cid<tree.cid){
tree.rc = addChild(c, tree.rc);
}
return tree;
}
}
跟踪新版本的过程如下所示:
Child tree = new Child();
tree.cid = 0;
tree.lc = new Child();
tree.lc.cid = 1;
Child c = new Child();
c.cid = 2;
addChild(c, tree);
// tree != null
// c.cid>tree.cid
tree.lc = addTree(c, tree.lc);
// tree != null
// c.cid>tree.cid
tree.lc = addTree(c, tree.lc);
// tree == null
return c;
return tree;
return tree;
递归方法只修改堆栈上的本地副本。.相反,你应该传递一个指针或传递一个对树节点的引用,这样当你在基本情况下分配一个子节点时,你就可以对实际的父节点而不是本地副本进行更改(本地副本在函数返回后被销毁)
二叉搜索树(BST)和二叉树(BT)中的插入有什么区别?我知道,在BST中,您将新节点的值与根进行比较,如果较小,则添加到其左侧,如果较大,则将其添加到根的右侧。BT的程序是否相同?如果没有,插入和移除的步骤是什么?
我最近完成了一个项目的二进制搜索树,我正在工作。很顺利,我学到了很多。然而,现在我需要实现一个常规的二叉树...出于某种原因,这让我难倒了。 我正在寻找一种方法来做我的InsertNode功能... 通常在BST中,您只需检查数据 有谁能帮我实现一个函数,只需将一个新节点从左到右不按特定顺序添加到二叉树中? 以下是我的BST插页:
我目前正在学习使用java的树,在二叉树中插入项时出现了一些错误,我不知道为什么它不起作用 这是代码:树节点: 树类: 每当我添加一个项目,根仍然为空,没有右或左的项目,如果有人能帮助我,我会非常感激
我试图在二叉树中插入节点,如果我用addNode(Node root)替换方法addNode(Node Node)代码运行良好。这是因为我在第一行声明了吗?请解释一下。addNode方法由于字数限制而不完整,否则它是完整的,运行良好。
我试图在二叉树中插入节点,如果我用addNode(Node root)替换方法addNode(Node Node)代码运行良好。这是因为我在第一行声明了吗?请解释一下。addNode方法由于字数限制而不完整,否则它是完整的,运行良好。