题目
分析
判断一棵树是否是二叉搜索树:中序遍历树,如果序列是升序序列则是二叉搜索树,否则不是二叉搜索树。
判断一棵树是否是完全二叉树:采用层次遍历的方式
- 如果一个节点左右孩子均存在,那么就poll,并把其左右孩子加入队列
- 如果一个节点左孩子为空,右孩子存在,那么这棵树一定不是完全二叉树‘
- 如果一个节点的左孩子不为空,右孩子为空,或者该节点的左右孩子均为空,且该节点之后的所有节点均是叶子节点,那么该树是完全二叉树,否则不是完全二叉树。
public boolean[] judgeIt (TreeNode root) {
// write code here
boolean[] res = new boolean[2];
ArrayList<Integer> list = new ArrayList();
judgeSearchTree(root,list);
res[0] = true;
res[1] = judgecompletedTree(root);
for(int i = 0; i < list.size()-1; i++) {
if(list.get(i) > list.get(i+1)) {
res[0] = false;
break;
}
}
return res;
}
//判断是否是二叉搜索树
public void judgeSearchTree(TreeNode root,ArrayList<Integer> list) {
if(root == null) {
return;
}
judgeSearchTree(root.left,list);
list.add(root.val);
judgeSearchTree(root.right,list);
}
//判断完全二叉树
public boolean judgecompletedTree(TreeNode root) {
if(root == null) {
return false;
}
Queue<TreeNode> q = new LinkedList<>();
q.add(root);
while(!q.isEmpty()) {
TreeNode t = q.peek();
if(t.left != null && t.right != null) {
q.add(t.left);
q.add(t.right);
q.poll();
}else if(t.left == null && t.right != null) {
return false;
}else if((t.left == null && t.right == null) ||(t.left != null && t.right == null)) {
q.poll();
while(!q.isEmpty()) {
TreeNode temp = q.poll();
if(temp.left != null || temp.right != null) {
return false;
}
}
}
}
return true;
}