题目:给定一棵二叉树,已经其中没有重复值的节点,请判断该二叉树是否为搜索二叉树和完全二叉树。
这道题目实际上就是两个问题的简单组合,直接使用两个函数分别去判断一下即可。
首先说一下二叉搜索树的判断,根据二叉搜索树的规则,左孩子 < 根节点 < 右孩子。所以只需要从上往下进行判断,是否符合这个规律,一旦不符合就 return false,否则去判断左右子树是不是也符合这个规律。
完全二叉树的话,是除了最后一层,其他的层都不会出现空节点。利用这个性质的话,对树进行层次遍历,一旦遇到空节点,判断剩余的节点是不是都是空节点,一旦出现空节点,那么说明不是完全二叉树,否则是完全二叉树。
完整代码如下:
public boolean[] judgeIt (TreeNode root) {
// write code here
boolean[] res = new boolean[2];
res[0] = isSearchTree(root);
res[1] = isCompeleteTree(root);
return res;
}
//完全二叉树 除了最后一行都是有左右孩子的
public boolean isCompeleteTree(TreeNode root) {
Queue<TreeNode> pre = new LinkedList<>();
pre.offer(root);
while(!pre.isEmpty()) {
TreeNode now = pre.poll();
if(now==null) {
while(!pre.isEmpty()) {
TreeNode tempNow = pre.poll();
if(tempNow!=null) {
return false;
}
}
}else {
pre.offer(now.left);
pre.offer(now.right);
}
}
return true;
}
//二叉搜索树 根节点大于左孩子 小于左孩子
public boolean isSearchTree(TreeNode root) {
if(root==null) {
return true;
}
int left = Integer.MIN_VALUE;
int right = Integer.MAX_VALUE;
if(root.left!=null) {
left = root.left.val;
}
if(root.right!=null) {
right = root.right.val;
}
if(left<root.val&&right>root.val) {
return isSearchTree(root.left)&&isSearchTree(root.right);
}else {
return false;
}
}