檢查是否爲BST(二叉查找樹(或二叉排序樹、二叉搜索樹))

一、題目內容java

題目描述函數

請實現一個函數,檢查一棵二叉樹是否爲二叉查找樹。
 給定樹的根結點指針TreeNode* root,請返回一個bool,表明該樹是否爲二叉查找樹。this

二、題目解析指針

方法1:由於二叉查找樹的中序遍歷是從小到大排序的,因此中序遍歷此樹,將節點的值存到集合中,在判斷集合是否從下到大有序,若是是,則此樹爲二叉查找樹。code

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:利用二叉查找樹的定義實現:排序

二叉查找樹,或者是一棵空樹,或者具備下面的性質:get

一、若它的左子樹不爲空,則左子樹上全部節點的值均小於它的根節點的值it

二、若它的右子樹不爲空,則其右子樹上全部節點的值均大於它的根節點的值。class

三、它的左右子樹也分別是二叉查找樹。import

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;
    }
}

不知道用定義作爲何通不過???

相關文章
相關標籤/搜索