判断一棵二叉树是否是完全二叉树
一,完全二叉树的三种节点
完全二叉树有右树必有左树,,节点编号和满二叉树一一对应
1,度为2的节点有n个
2,度为1的节点只能有1个
3,度为0的节点有n个
二,具体思路
1,分两个阶段,第一阶段所有节点都有左树右树,当遇到节点只有左树,或是没有子树切换第二阶段
2,该阶段所有节点权全为叶子节点,遇到一个节点有子树就不是完全二叉树
3,使用层序遍历,借用队列求解
三,代码实现
public class IsCompleteTree {
public boolean isCompleteTree(TreeNode root) {
if (root == null) {
return true;
}
//层序
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
//引入标志位
boolean flag = false;
while (!queue.isEmpty()) {
//cur表示当前访问节点
TreeNode cur = queue.poll();
if (!flag) {
if (cur.left != null && cur.right != null) {
//当前在第一阶段
queue.offer(cur.left);
queue.offer(cur.right);
} else if (cur.right != null && cur.left == null) {
// 此时只有右树没有左树,反例
return false;
} else if (cur.left != null && cur.right == null) {
//切换状态
// 只有左树没有右树,此时cur是碰到的第一个只有左树的节点
flag = true;
queue.offer(cur.left);
} else {
// 此时左树和右树全部为空,cur第一个碰到的叶子节
flag = true;
}
}else{
// 此时处在第二阶段,第二阶段中的所有节点不可能有子树
// 有一个反例就false
if (cur.left != null || cur.right != null) {
return false;
}
}
}
return true;
}
}