检查二叉树是否为二叉搜索树-为什么我的代码不起作用?

时间:2018-11-14 19:20:54

标签: tree binary-tree binary-search-tree

您将获得二叉树的根,并且必须检查它是否是二叉搜索树。请注意,所有节点的值都是不同的(这是Hackerrank在“树”部分中的一个问题)。 This是链接

我真的不明白为什么我的代码不起作用。没有道理。

这是我在Java中的代码

class C {
  constructor() {
    this.a = 1;
  }
}

function f(n, m) {
  console.log(this.a + n + m);
}

let c = new C();
var boundF = f.bind(c, 2); // the context `c` is now bound to f
boundF.apply(null, [3]); // no reason to supply any context, since we know it's going to be `c`

代码可以运行,但是在此测试用例中失败:

2 1 2 4 3 5 6 7

它输出是而不是否。同样,我不确定它们是如何从数组中构建树的,但这并不重要。

我的问题:

  1. 为什么我的代码不起作用?
  2. 我的第一个基本案例是否正确?我将其设置为false,以使其更具挑战性
  3. 如果有那么多的if语句,那是好代码还是坏代码?您是否建议使用if-else语句?

谢谢

1 个答案:

答案 0 :(得分:0)

问题在于您如何仅检查条件是否仅适用于直系子代而不适用于整个左子树和右子树。通过此示例,您可以直观地看到代码问题。

    3
   / \
  2   5
 / \
1   4

您可以看到4节点大于其父节点,但不小于其祖父母节点。但是,情况并非如此,因为3左侧的每个节点都应小于3。

问题指出,对于每个节点,左后代必须小于该节点,而右后代必须大于该节点。您需要做的是跟踪节点可以取的最小值和最大值。

boolean checkBST(Node root) {
  return checkBST(node, Integer.MIN_VALUE, Integer.MAX_VALUE);
}

boolean checkBST(Node root, int min, int max) {
  if(root == null) return true;
  if(root.data < min || root.data > max) return false;

  return checkBST(root.left, min, root.data) && checkBST(root.right, root.data, max);
}

trueroot的情况下,我们将返回null,因为这样一来,当我们不需要检查左右节点不是{ {1}},然后再对其调用null。接下来需要检查的是checkBST的值是否在有效范围内。最后一步是检查所有儿童的价值观是否也在其正确范围内。左后代必须全部小于根,而右后代必须全部大于根。因此,为了检查左边的孩子,我们将根的值设为最大值,对于右边的孩子,我们将根的值设为最小值。

相关问题