验证二叉搜索树

83 阅读2分钟

题目描述

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

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

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

示例 1:

image.png

输入: root = [2,1,3]
输出: true

示例 2:

image.png

输入: root = [5,1,4,null,null,3,6]
输出: false
解释: 根节点的值是 5 ,但是右子节点的值是 4

思路及代码实现

  1. 首先明确二叉搜索树的定义:
    • 有效 二叉搜索树定义如下:
    • 节点的左子树只包含 小于 当前节点的数
    • 节点的右子树只包含 大于 当前节点的数
    • 所有左子树和右子树自身必须也是二叉搜索树
  2. 明确搜索顺序:由于二叉搜索树的顺序是:左子树<root<右子树,所以,我们使用中序遍历正好与二叉搜索树的顺序一致。
  3. 明确初始思路:
    • 按照中序遍历遍历二叉树的节点,将遍历的节点放入数组中,最后判断数组是否为升序数组,若是,则该树是二叉搜索树,若不是,则该树不是二叉搜索树

代码实现:


*   Definition for a binary tree node.
*   class TreeNode {
*       val: number
*       left: TreeNode | null
*       right: TreeNode | null
*       constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
*           this.val = (val===undefined ? 0 : val)
*           this.left = (left===undefined ? null : left)
*           this.right = (right===undefined ? null : right)
*       }
*   }
    \*/

function isValidBST(root: TreeNode | null): boolean {
let arr:Array<number>=\[];
getArr(root,arr);
console.log(arr);

    // 判断arr 是否是升序数组
    for(let i=0;i<arr.length;i++){
        if(arr[i]>=arr[i+1]){
            return false;
        }
    }

    return true;

};
function getArr(root: TreeNode | null,arr:Array<Number>): void {
// 终止条件
if(root==null) return null;

    //左
    getArr(root.left,arr);
    //中
    arr.push(root.val);
    // 右
    getArr(root.right,arr);

};

运行结果:

image.png

  1. 优化初始思路:采用上述做法,要另外定义一个数组,还要去判断这个数组是否为升序,这样有点麻烦,那我们是否可以直接在遍历二叉树时就去比较二叉树节点的大小呢?
  • 思路如下:定义一个记录最大值的变量
    let maxValue=Number.MIN_SAFE_INTEGER;
    function isValidBST(root: TreeNode | null): boolean {
      // 终止条件
      if(root==null) return true;

      //左
      let left=isValidBST(root.left);

      //中
      if(maxValue<root.val){
          maxValue=root.val;
      }else {
          return  false;
      }

      // 右
      
      let right= isValidBST(root.right);
      return left&&right;
    };
    
  1. 再调整下思路,直接用本次节点与上次节点做对比。
  • 代码如下:

    let pre=null;
    function isValidBST(root: TreeNode | null): boolean {
        // 终止条件
        if(root==null) return true;

        //左
        let left=isValidBST(root.left);

        //中
        console.log(pre!=null&&pre.val>root.val);
        console.log(pre!=null,pre);
        if(pre!=null&&pre.val>root.val){
            return false;
        }else{
            pre=root;
        }
        
        // 右
        let right= isValidBST(root.right);
        return left&&right;
    };
    

总结

判断一可二叉树是否是二叉搜索树,首先要明白搜索二叉树的特性,根据二叉树搜索确定遍历顺序,然后去设计解题思路。以上便是验证二叉搜索树的思路了,如有错误之处,欢迎大家留言指出,谢谢大家了。