BST中序遍历有有序的,这是充要条件。---保存前一个节点:成员变量pre
private TreeNode pre;
public boolean isBst(TreeNode root){
if(root==null){
return true;
}
if(!isBst(root.left)){
return false;
}
if(pre!=null&&pre.val>=root.val){
return false;
}
//保存前一个节点
pre=root;
if(!isBst(root.right)){
return false;
}
return true;
}
完全二叉树,层次遍历遇到第一个空节点后,剩余节点还有非空,则一定不是.巧用continue
并配合标志位。
/**
* 验证是否为完全二叉树
* @param root 树
* @return 验证是否为完全二叉树
*/
public boolean isCompleteTree(TreeNode root) {
if(root==null){
return true;
}
Queue<TreeNode> queue=new LinkedList<>();
queue.add(root);
TreeNode cur;
boolean notComplete=false;
while (!queue.isEmpty()){
cur=queue.remove();
if(cur==null){
notComplete=true;
//第一个空节点之后的节点,countinue使用的很妙
continue;
}
if(notComplete){
return false;
}
queue.add(cur.left);
queue.add(cur.right);
}
return true;
}
最后答案依次调用以上两个函数OK。注意返回数组时前面有new boolean[]
public boolean[] judgeIt (TreeNode root) {
return new boolean[]{isBst(root), isCompleteTree(root)};
}