二叉树系列---判断给定的二叉树是否为二叉查找树

题目

判断给定的二叉树是否为二叉查找树

方法1

递归判断:先判断左子树是否为二叉查找树;再判断右子树;最后判断根(根小于左子树的最大节点值,大于右子树的最左节点值);

public boolean isValidBST(TreeNode root){
        if(root==null){
            return true;
        }
        if(root.left==null && root.right==null){
            return true;
        }
        boolean l=isValidBST(root.left);
        boolean r=isValidBST(root.right);

        boolean res=l && r;

        if(root.left!=null){
            TreeNode lnode=root.left;
            while(lnode.right!=null){
                lnode=lnode.right;
            }
            if(lnode.val<root.val){
                res=res && true;
            }else{
                res=false;
            }
        }

        if(root.right!=null){
            TreeNode rnode=root.right;
            while(rnode.left!=null){
                rnode=rnode.left;
            }
            if(rnode.val>root.val){
                res=res && true;
            }else{
                res=false;
            }
        }

        return res;     
    }

方法2

利用二叉查找树的性质:二叉查找树的中序遍历是有序的(从小到大);
先进行中序遍历得到中序序列,再判断中序序列是否有序;

public boolean isValidBST(TreeNode root){
        ArrayList<Integer> inOrderList=new ArrayList<Integer>();
        inOrder(inOrderList,root);
        for(int i=0;i<inOrderList.size()-1;i++){
            if(inOrderList.get(i)>=inOrderList.get(i+1)){
                return false;
            }
        }
        return true;
    }

    //得到中序序列
    private void inOrder(ArrayList<Integer> inOrderList, TreeNode root) {
        if(root==null){
            return;
        }
        inOrder(inOrderList,root.left);
        inOrderList.add(root.val);
        inOrder(inOrderList,root.right);
    }
    原文作者:二叉查找树
    原文地址: https://blog.csdn.net/bh_xiaoxinba/article/details/53046201
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞