我创建了一个二叉搜索树类。我创建了插入方法,高度方法和打印方法。当我插入时,一切看起来都很好。如果root为null,我创建一个新的根并设置该项。但是当我调用我的高度方法时,它打印出2而不是1.当我调用我的print方法时,它打印出所有元素,包括root两次。例如,我按以下顺序插入以下元素:9,5,4,55,555
当我调用我的PREorderPRINT方法时,它打印出来:9,5,4,9,55,555
打印的值是正确的,除了我从未插入的中间的副本9。我的insert方法不使用递归。但我的高度和打印方法使用递归。
我的递归preOrderPrint会检查root!= null,然后打印item,左转,然后右转。当我在我的公共预订方法中调用preorder时,我首先检查它是否为空树,如果没有,那么我通过将root传递给preOrderPRint(root)来打印它
我的递归高度方法检查root是否为null并返回零。如果没有,它将获得root的左右子树的高度,比较它们,并返回left + 1或right + 1。当我调用我的公共高度方法时,我检查root是否为null并返回零,否则调用递归高度在root中传递。
当我将一个元素9插入树中并调用我的高度方法时,它打印出高度为2.但是我的size方法打印出正确的大小,1。我的递归有问题preorderPrint和高度方法。我似乎无法弄清楚我错过了什么。有没有我忘记添加的特殊情况?
编辑:我发布了代码并删除了它。解决了这个问题。我所要做的就是将else更改为else-if并添加一个条件来比较root和要插入的项目。我这是个愚蠢的错误。答案 0 :(得分:1)
我的问题出在我的插入方法中。我的第一个案例检查了根节点是否为空。如果为null,则创建一个等于根的节点并设置该项。
我的第二个案例比较了我的root并检查了是否插入的项目是否小于root,如果是,它"得到"左边的节点。在此之后,如果要插入的项目大于根,它将获得"右边的节点。
接下来,我有另一个if-else块,如果item小于root,则将项设置在左侧。在此之后,我只有一个else语句将项目设置为右侧的节点,无论它是否已插入root == null的情况。
要修复我的问题,我必须将此else语句更改为if-else语句并添加一个条件,检查是否插入的项目大于root。这阻止了根插入两次。