import java.util.*;
/*
* public class TreeNode {
* int val = 0;
* TreeNode left = null;
* TreeNode right = null;
* }
*/
public class Solution {
/**
*
* @param root TreeNode类 the root
* @return bool布尔型一维数组
*/
public boolean[] judgeIt (TreeNode root) {
if(root == null || (root.left == null && root.right == null)) return new boolean[]{true , true} ;
boolean[] res = new boolean[2] ;
res[0] = isSearchTree(root) ;
res[1] = isCompleteTree(root) ;
return res ;
}
public boolean isSearchTree(TreeNode root) {
if(root == null || ((root.left == null && root.right == null))) return true ;
//寻找左子树的最大值
int lMax = -1 ;
if(root.left != null) {
TreeNode t = root.left ;
while(t.right != null) {
t = t.right ;
}
lMax = t.val ;
}
//寻找右子树的最小值
int rMin = 500001 ;
if(root.right != null) {
TreeNode t = root.right ;
while(t.left != null) {
t = t.left ;
}
rMin = t.val ;
}
if(root.val > lMax && root.val < rMin) {
return isSearchTree(root.left) && isSearchTree(root.right) ;
} else {
return false ;
}
}
public boolean isCompleteTree(TreeNode root) {
if(root == null) return true ;
Queue<TreeNode> que = new LinkedList<>() ;
que.offer(root) ;
TreeNode t = null ;
boolean firstLeave = false ;//是否出现 缺右
while(!que.isEmpty()) {
t = que.poll() ;
if(t.left == null && t.right != null) return false ;
if(firstLeave && !(t.left == null && t.right == null)) {
return false ;
}
//只要第一次出现 缺右现象,后面的节点都必须是 叶子结点
if(firstLeave == false && t.right == null) {
firstLeave = true ;
}
if(t.left != null) que.offer(t.left) ;
if(t.right != null) que.offer(t.right) ;
}
return true ;
}
}