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

为什么插入到BST插入根两次?

周宏胜
2023-03-14

我创建了一个二叉查找树类。我创建了我的插入方法、高度方法和打印方法。当我插入时,一切看起来都很好。如果根为空,我创建一个新的根并设置该项目。但是当我调用我的高度方法时,它打印出2而不是1。当我调用print方法时,它会两次打印出包括root在内的所有元素。例如,我按以下顺序插入了以下元素:9, 5, 4, 55, 555

当我调用PREorderPRINT方法时,它会输出:9, 5, 4, 9, 55, 555

打印的值是正确的,除了中间没有重复的9。我的insert方法不使用递归。但是我的高度和打印方法使用递归。

我的递归preOrderPrint检查是否为root=null,然后它打印项目,左移,右移。当我在我的publicproorder方法中调用preorder时,我首先检查它的树是否为空,如果不是,那么我通过将root传递给preOrderPRint(root)来打印它

我的递归高度方法检查根是否为空并返回零。如果不是,它获取根的左子树和右子树的高度,比较它们,并返回左1或右1。当我调用我的公共高度方法时,我检查根是否为空并返回零,否则在根中调用递归高度传递。

当我在树中插入一个元素9并调用我的height方法时,它会打印出高度为2。但是我的尺寸方法打印出正确的尺寸,1。我的递归preorderPrint和height方法肯定有问题。我似乎不知道我错过了什么。是否有我忘记添加的特殊情况?

编辑:我发布代码并将其删除。解决了这个问题。我所要做的就是将else更改为else if,并添加一个条件来比较根目录和插入的项。我犯了一个愚蠢的错误。

共有1个答案

寿丰
2023-03-14

我的问题在于我的插入方法。我的第一个案例检查根节点是否为null。如果为null,则创建一个等于根的节点并设置项。

我的第二个案例比较了我的根,并检查要插入的项是否小于根,如果小于根,它将“获取”左侧的节点。在此之后,如果要插入的项大于根,它将“获取”右侧的节点。

接下来,我有另一个if-else块,如果项小于root,则将该项设置为左侧。在这之后,我只有一个else语句,该语句将该项设置为右侧的节点,而不管它是否已插入root==null大小写中。

为了解决我的问题,我必须将这个别人语句更改为一个if-别人语句,并添加一个条件来检查插入的项是否大于根。这防止了根被插入两次。

 类似资料:
  • 编辑:我想出来了——放弃了这个设计,重新开始,它成功了!谢谢你的建议。 我正在做一个BST算法的家庭作业,我绝望地被困在插入方法上。我在网上找到的所有资源都有一个与我创建的版本相似的版本,但是我没有通过教授给我们的JUnit测试。我可以通过基本情况(root.payload==value的空根和二叉树)。不过,我似乎无法通过下一个测试。这是我的插入(root, value)方法代码: 最终返回的是

  • 对于添加的上下文,这里是Main(),我在这里调用insert()并尝试将字符串插入到BST中: 最后,我的控制台输出:

  • 我编写了以下代码来实现BST的递归插入方法。但是当我以遍历顺序打印树时,它会在插入之前打印原始树。似乎没有插入元素。请帮帮我。提前谢谢。另外,请建议更改代码。顺便说一下,初始树的遍历顺序是2 5 6 7 8。

  • 我试图插入二叉查找树使用递归,然后打印它预先使用这个特定的代码,但我只有根作为输出,为什么?这是因为每个时间栈(每次调用后)弹出从而删除新节点?这是一个java代码)

  • 通常我们主要称之为insert,比如

  • 问题内容: 我正在使用较大的随机数作为密钥(来自另一个系统)。在相当小的表(如几百万行)上进行插入和更新所花费的时间比我认为合理的长得多。 我已经提炼了一个非常简单的测试来说明。在测试表中,我尝试使其尽可能简单。我的真实代码没有如此简单的布局,并具有关系和附加索引等。但是,更简单的设置将显示等效的性能。 结果如下: 在MyISAM中插入1M行需要6秒钟;进入InnoDB需要 3433秒 ! 我究竟