【问题标题】:Why does Insertion into BST insert root twice?为什么插入 BST 插入根两次?
【发布时间】:2014-10-16 21:31:59
【问题描述】:

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

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

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

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

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

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

编辑:我发布了代码并删除了它。修复了问题。我所要做的就是将一个 else 更改为一个 else-if 并添加一个条件来比较根与插入的项目。我犯了一个愚蠢的错误。

【问题讨论】:

  • 你能添加一些代码吗?
  • 我无法添加代码。如果有同学抄了,被教授发现了,那我就得不分了。我的教授有一双敏锐的眼睛。但是我上面写的对应我的代码。这些是我搜索和插入的所有案例。我所有的语法都是正确的。我相信我错过了一些特殊情况。我想知道是否有人有任何想法,即使是最小的。
  • 没有源代码很难调试程序。如果没有它,这个问题也不太可能对其他用户有用。至少能提供一些伪代码吗?
  • 问题必须在插入中。您只共享了根创建,而不是后续插入。 preOrder & height 的描述有正确的概念。你能提供插入的伪代码吗?另请注意,在 BST 中,通常有某种形式的比较,以便以某种方式对值进行排序。我相信您的 preOrder 应该按升序返回整数。
  • 我修好了。我所要做的就是将 else 语句更改为 else-if 并添加一个比较条件。我花了 2 个小时试图修复它。感谢那些发布帮助的人:)

标签: java insert tree binary-search-tree


【解决方案1】:

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

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

接下来我有另一个 if-else 块,如果 item 小于 root,则将 item 设置到左侧。在此之后,我只有一个 else 语句,它将项目设置为右侧的节点,无论它是否已经插入到 root==null 案例中。

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

【讨论】:

    猜你喜欢
    • 2020-01-11
    • 1970-01-01
    • 2017-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多