分析
假设一棵树是完全二叉树,层数为K,那么可以得到以下结论:
1.前k-1层节点肯定都是饱和的,即到达了最大值;
2.第k-1层不一定所有的节点都有孩子节点,如果有孩子节点,那么一定是左孩子节点。
所以我们要先找到第一个孩子不全的节点,如果只有右孩子节点,那么一定不是完全二叉树。
找到第一个不饱和节点后,后续所有节点不能有孩子节点。
步骤
1.按照层序遍历的方式,找到第一个不饱和节点,判断其孩子是不是左孩子,不是直接返回false;
2.从该节点之后所有节点不能有孩子。如果有孩子,一定不是完全二叉树。
代码
/**
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public boolean isCompleteTree(TreeNode root) {
boolean isComleteTree() {
if(root == null) {
return true;
}
//树非空,就找其第一个不饱和节点,即只有一个孩子节点
//按层序遍历的方式找
Queue<BTNode> q = new LinkedList<>();
q.offer(root);
boolean isLeafOrLeft = false; //设置标志位,找到第一个不饱和节点后置为true。
while (!q.isEmpty()) {
BTNode cur = q.poll();
if (isLeafOrLeft) { //满足条件后后序节点不能有孩子节点
if (cur.left != null || cur.right != null) {
return false;
}
} else { //不满足条件就一直按照层序遍历的方式找第一个不饱和节点
if (cur.left != null && cur.right != null) {
q.offer(cur.left);
q.offer(cur.right);
} else if (cur.left != null) {
//找到第一个不饱和节点后,将标志位置为true
q.offer(cur.left);
isLeafOrLeft = true;
} else if (cur.right != null) {
//此时只有右孩子,一定不是完全二叉树
return false;
} else {
//cur是叶子节点,后面所有节点不能有孩子了
isLeafOrLeft = true;
}
}
}
return true;
}
}