繁体   English   中英

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

[英]Why does Insertion into BST insert root twice?

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

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

打印的值是正确的,除了中间从未出现过的重复项9。 我的插入方法不使用递归。 但是我的身高和打印方法使用递归。

我的递归preOrderPrint检查root!= null,然后打印项目,左移,右移。 在我的公共预订方法中调用预订时,我首先检查树是否为空,如果不是,则通过将根传递给preOrderPRint(root)进行打印

我的递归高度方法检查root是否为null并返回零。 如果不是,它将获取根的左和右子树的高度,对其进行比较,然后返回left + 1或right + 1。 当我调用public height方法时,我检查root是否为null并返回零,否则调用递归高度传递给root。

当我在树中插入一个元素9并调用我的height方法时,它会打印出高度为2。但是我的size方法会打印出正确的大小为1。我的递归preorderPrint和height一定有问题方法。 我似乎无法弄清楚我所缺少的。 我有没有忘记添加的特殊情况?

编辑:我张贴代码并将其删除。 解决了问题。 我要做的就是将else更改为else-if,并添加条件以将root与要插入的项目进行比较。 我一个愚蠢的错误。

我的问题出在我的插入方法上。 我的第一种情况检查根节点是否为空。 如果为null,则创建一个等于根的节点并设置项目。

我的第二种情况比较了我的根,并检查要插入的项是否小于根,如果是,则“获取”左侧的节点。 此后,如果要插入的项目大于根,它将“获得”该节点到右侧。

接下来,我还有另一个if-else块,如果item小于root,则将该项设置为左侧。 此后,我只有一个else语句,可以将该项设置为右侧的节点,无论该项是否已经插入root == null情况下。

为了解决我的问题,我不得不将此else语句更改为if-else语句,并添加条件以检查要插入的项是否大于root。 这样可以防止将根插入两次。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM