检查是否为BST(二叉查找树(或二叉排序树、二叉搜索树))

1、题目内容

题目描述

请实现一个函数,检查一棵二叉树是否为二叉查找树。
 给定树的根结点指针TreeNode* root,请返回一个bool,代表该树是否为二叉查找树。

2、题目解析

方法1:因为二叉查找树的中序遍历是从小到大排序的,所以中序遍历此树,将节点的值存到集合中,在判断集合是否从下到大有序,如果是,则此树为二叉查找树。

import java.util.*;
/*
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;
    public TreeNode(int val) {
        this.val = val;
    }
}*/
public class Checker {
    ArrayList<Integer>list = new ArrayList<Integer>();
    public boolean checkBST(TreeNode root) {
        // write code here
        //中序遍历,如果是有序的就是二叉搜索树。
        inorder(root);
        for(int i=0;i<list.size()-2;i++){
            if(list.get(i)>list.get(i+1)){
                return false;
            }
        }
        return true;
    }
    public void inorder(TreeNode root){
        if(root!=null){
            inorder(root.left);
            list.add(root.val);
            inorder(root.right);
        }
    }
}

方法2:利用二叉查找树的定义实现:

二叉查找树,或者是一棵空树,或者具有下面的性质:

1、若它的左子树不为空,则左子树上所有节点的值均小于它的根节点的值

2、若它的右子树不为空,则其右子树上所有节点的值均大于它的根节点的值。

3、它的左右子树也分别是二叉查找树。

import java.util.*;
/*
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;
    public TreeNode(int val) {
        this.val = val;
    }
}*/
public class Checker {
    ArrayList<Integer>list = new ArrayList<Integer>();
    public boolean checkBST(TreeNode root) {
        // write code here
        if(root==null) return true;
        if(root.left==null&&root.right==null) return true;
        while(root.left!=null&&root.right!=null){
            if(root.left.val<root.val){
                root = root.left;
            }else{
                return false;
            }
            if(root.right.val>root.val){
                root = root.right;
            }else{
                return false;
            }
        }
        return true;
    }
}

不知道用定义做为什么通不过???

你可能感兴趣的:(检查是否为BST(二叉查找树(或二叉排序树、二叉搜索树)))