题目描述
给定一棵二叉树,已经其中没有重复值的节点,请判断该二叉树是否为搜索二叉树和完全二叉树。
示例1
输入
复制
{2,1,3}
输出
复制
[true,true]
备注:
n≤500000
分析:
BST特点:左子值比根节点小,右子值比根节点大
完全二叉树特点:每一层节点按照从左到右的顺序存放,每一层必须放满才可以放下一层,比如下图两种就属于不合法的完全二叉树
基于上述特点,我们可以写出代码:
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布尔型一维数组
*/
int pre = Integer.MIN_VALUE;
boolean f = false;
public boolean isSearch(TreeNode root){
if(root!=null){
boolean res = isSearch(root.left);//左侧走到头
if(!res) return false;
if(root.val<=pre) return false;//从右侧开始判断,如果小于左侧,非法
pre = root.val;//pre 保存的是左侧节点的值
return isSearch(root.right);
}
return true;
}
//递归方式
public boolean isComplete1(TreeNode root){
if(root == null) return true;
if(root.left==null&&root.right==null) return true;
//左子不为空右子为空的情况只能出现一次,类似于我画的图左边那种情况是不合法的
if(root.left!=null&&root.right==null){
if(f) return false;
f = true;
}
//左子为空右子不为空是非法的,我画的图右边
if(root.left==null&&root.right!=null)return false;
return isComplete1(root.left)&&isComplete1(root.right);
}
//非递归方式
public boolean isComplete2(TreeNode root){
if(root == null) return true;
Queue<TreeNode> q=new LinkedList<>();
q.add(root);
TreeNode pre = root;//pre保存的是顺序遍历的前一个节点
while(!q.isEmpty()){
int c = q.size();
for(int i = 0;i < c;i++){
TreeNode node = q.poll();
//出现了我画的图中的情况
if(pre == null&&node!=null) return false;
if(node!=null){
q.add(node.left);
q.add(node.right);
}
pre = node;
}
}
return true;
}
public boolean[] judgeIt (TreeNode root) {
// write code here
boolean[] ans = new boolean[2];
ans[0] = isSearch(root);
ans[1] = isComplete2(root);
return ans;
}
}