一、題目內容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; } }
不知道用定義作爲何通不過???