核心代码:
import java.util.*;
/*
* public class TreeNode {
* int val = 0;
* TreeNode left = null;
* TreeNode right = null;
* }
*/
public class Solution {
public class BSTInfo{
int max;
int min;
boolean isBST;
public BSTInfo(int max,int min,boolean is){
this.isBST=is;
this.max=max;
this.min=min;
}
}
/**
*
* @param root TreeNode类 the root
* @return bool布尔型一维数组
*/
public boolean[] judgeIt (TreeNode root) {
// write code here
boolean[] res={false,false};
if(root==null){
res[0]=true;
res[1]=true;
return res;
}
//先判断是不是平衡二叉树
res[0]=BSTprocess(root,Integer.MIN_VALUE,Integer.MAX_VALUE);
//判断是不是完全二叉树
res[1]=isCompleted(root);
return res;
}
//判断平衡二叉树(左孩子的值 < 父结点的值 < 右孩子的值)
public boolean BSTprocess(TreeNode node,int min,int max){
if(node==null) return true;
if(node.val< min || node.val>max){
return false;
}
return BSTprocess(node.left,min,node.val) && BSTprocess(node.right,node.val,max);
}
public boolean isCompleted(TreeNode node){
if(node==null) return true;
Queue<TreeNode> queue=new LinkedList<>();
queue.add(node);
boolean isMeet=false;//判断之前是否遇到过孩子不全的
//宽度优先遍历
while(!queue.isEmpty()){
TreeNode cur=queue.poll();
TreeNode left=cur.left;
TreeNode right=cur.right;
if(left==null && right!=null) return false;//有右孩子没有左孩子
//之前遇到过孩子不双全的节点,且当前节点还不是叶子节点
if(isMeet && (left!=null || right!=null)) return false;
if(left!=null) queue.add(left);
if(right!=null) queue.add(right);
if(left==null || right==null) isMeet=true;//这个判断状态的变量要放在上面两种情况判断的后面
}
return true;
}
}