zoukankan      html  css  js  c++  java
  • leetcode-验证二叉搜索树

    给定一个二叉树,判断其是否是一个有效的二叉搜索树。

    假设一个二叉搜索树具有如下特征:

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

    示例 1:

    输入:
        2
       / 
      1   3
    输出: true
    

    示例 2:

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


    思路:了解中序遍历的过程,利用中序遍历,将所有的数组取出,如果是取出的数字形成数组是从小到大排列的,则说明是探索二叉树。
    /**
    * Definition for a binary tree node.
    * public class TreeNode {
    *     int val;
    *     TreeNode left;
    *     TreeNode right;
    *     TreeNode(int x) { val = x; }
    * }
    */
    class Solution {
        List<Integer> list=new ArrayList();
        public boolean isValidBST(TreeNode root) {
           inOrder(root,list);
            for(int i=1;i<list.size();i++){                           //取出的值与上一个值进行比较
                int temp=list.get(i-1);
                if(temp>=list.get(i))return false;
            }
            return true;
        }
        public void inOrder(TreeNode root,List list){                //中序遍历!
            if(root==null)return;
            inOrder(root.left,list);
            list.add(root.val);                                               //中序遍历是先访问左子树,进行操作之后,再访问右子树
            inOrder(root.right,list);
        }
        
        }

    方法二:初始化时带入系统最大值和最小值,在递归过程中换成它们自己的节点值,用long代替int就是为了包括int的边界条件,代码如下:
    /**
    * Definition for a binary tree node.
    * public class TreeNode {
    *     int val;
    *     TreeNode left;
    *     TreeNode right;
    *     TreeNode(int x) { val = x; }
    * }
    */
    class Solution {
        public boolean isValidBST(TreeNode root) {
            return isValid(root,Long.MIN_VALUE,Long.MAX_VALUE);
        }
        public boolean isValid(TreeNode root,long a,long b){         //递归函数式,分别向左子树和右子树递归
            if(root==null)return true;
            if(root.val<=a||root.val>=b)return false;    //若为结点的左子树,比节点的值大,或者是结点的右子树,比结点的值小,都返回False
            return isValid(root.left,a,root.val)&&isValid(root.right,root.val,b);    //将左子树和右子树递归
        }
    }
  • 相关阅读:
    面试题
    面试题-基础篇(1)
    Windows定时器学习
    C++中类的多态与虚函数的使用
    Win32 SDK 编程开始, 创建窗口, 消息的处理, 消息循环
    线程同步(互斥锁与信号量的作用与区别)
    控制台程序实现暂停功能
    Linux下gcc编译生成动态链接库*.so文件并调用它
    Linux下安装ActiveMQ CPP
    activemq Linux下的编译
  • 原文地址:https://www.cnblogs.com/patatoforsyj/p/9491320.html
Copyright © 2011-2022 走看看