【问题标题】:Can't return my value correctly when recursing a Binary Search Tree递归二叉搜索树时无法正确返回我的值
【发布时间】:2017-08-27 07:35:31
【问题描述】:

我已经测试过我的树是否被正确插入,并且正在使用伪经典实例化来完成这项工作。我的问题是调试器会告诉我真值被设置为真,然后当我从函数末尾返回真值时,我得到假。我已经尝试了我能想到的一切,但我无法弄清楚为什么会发生这种情况。这是我搜索二叉搜索树的代码。

  var valuetest;
  var truth = false;
  if (this.value === value) {
    var truth = true;
    return truth;
  } else if (value > this.value) {
    valuetest = this.right.value;
    if (valuetest === value) {
      truth = true;
      return truth;
    } else {
      this.right.contains(value);
    }
  } else {
    valuetest = this.left.value;
    if (valuetest === value) {
      truth = true;
      return truth;
    } else {
      this.left.contains(value);
    }
  }
  return truth;
  //returns false even if truth is set to true for some reason.

【问题讨论】:

  • this.right.contains(value);更新为return this.right.contains(value);,与left相同。
  • 另外,您没有检查 NULL(即树的结尾)
  • 谢谢,您的解决方案有效,现在我必须弄清楚 null 实现检查。

标签: javascript recursion binary-search-tree


【解决方案1】:

更新了返回的行。试试这个 sn-p。

  var valuetest;
  var truth = false;
  if (this.value === value) {
    var truth = true;
    return truth;
  } else if (value > this.value) {
    valuetest = this.right.value;
    if (valuetest === value) {
      truth = true;
      return truth;
    } else {
      return this.right.contains(value);
    }
  } else {
    valuetest = this.left.value;
    if (valuetest === value) {
      truth = true;
      return truth;
    } else {
      return this.left.contains(value);
    }
  }
  return truth;
  //returns false even if truth is set to true for some reason.

【讨论】:

    【解决方案2】:

    你忘了return 递归调用。所以你看到 thruth 变成了真的,但是在递归之后的一级,truth 变量有一个不同的变量,它根本没有被设置。

    此外,您已经通过重复相等性检查实现了arm's length recursion,这在此处确实没有必要。您可以将代码压缩为:

    return value === this.value  ||
           value > this.value && this.right && this.right.contains(value) ||
           value < this.value && this.left && this.left.contains(value);
    

    如果未找到该值,则应停止递归。如果您以value 代表叶子时为nullundefined 的方式构建树,则上述方法将起作用。

    或者,当该方向没有更多子项时,您可以省略 left 和/或 right 属性。此外,如果树是这样构建的,上面的代码将起作用。

    或者更聪明一点:

    const branch = this[value > this.value ? 'right' : 'left'];
    return value === this.value  || branch && branch.contains(value);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-28
      • 1970-01-01
      • 1970-01-01
      • 2014-01-02
      • 1970-01-01
      • 2021-07-03
      • 2019-04-17
      • 1970-01-01
      相关资源
      最近更新 更多