面试热题(验证二叉搜索树)

给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。

有效 二叉搜索树定义如下:

  • 节点的左子树只包含 小于 当前节点的数。
  • 节点的右子树只包含 大于 当前节点的数。
  • 所有左子树和右子树自身必须也是二叉树

       二叉树满足以上3个条件,有些同学就会说,BST不就是左大右小么?我直接判断root.val>root.left.valroot.val<root.right.val不就可以了么?

         这样肯定是不对的,因为BST左小右大的特性是指root.val要比左子树的所有节点要大,要比右子树上的所有节点要小,所以只是检查两个节点当前是不够的,我们可以通过辅助函数,增加函数参数列表,在参数中携带额外信息,将下一个节点的合理取值范围传递下去,进行判断

因为root节点开始没有范围的限制,所以我们对其的边界可以最小的无穷,最大也是无穷

isValidBST(root,Integer.MIN_VALUE,Integer.MAX_VALUE);

如果当前节点不符合合法边界,直接返回false

 if(node.val<=lower||node.val>=upper){
            return false;
        }

去遍历当前节点的左子树和右子数,并更新取值范围

isValidBST(node.left,lower,node.val)&&isValidBST(node.right,node.val,upper);

结果:

       看到测试案例顿时豁然开朗,一看这种比较大的数,一看就是数值类型的问题,超出范围了,然后我们将Integer改为更大的Long,然后:

猜你喜欢

转载自blog.csdn.net/dfdbb6b/article/details/132261567