力扣(LeetCode)问题:958. 二叉树的完全性检验
如图:几种常见的不同形态的二叉树
完全二叉树特点:
1.满二叉树(是完全二叉树的特殊形态)从最后一层最右侧节点开始连续缺少N个节点(N小于满二叉树最后一层节点数),即为一颗完全二叉树;
2.完全二叉树中只能存在一个只有左孩子没有右孩子的节点;
3.完全二叉树中不可能存在只有右孩子没有左孩子的节点;
层序遍历完全二叉树:1.当遇到第一个只有左孩子没有右孩子的节点时,说明剩下的节点必须都是叶子节点;
2.当遇到第一个叶子节点时,说明剩下的节点必须都是叶子节点;
//题解代码
public boolean isCompleteTree(TreeNode root) {
//队列协助实现层序遍历
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
//tmp代表当前遍历状态
boolean tmp = false;
while (!queue.isEmpty()) {
TreeNode mid = queue.poll();
//第一种状态
if (!tmp) {
if (mid.left != null && mid.right != null) {
queue.offer(mid.left);
queue.offer(mid.right);
} else if (mid.left != null && mid.right == null) {
//遇到第一个只有左孩子没有右孩子的节点,
// 完全树种只能有一个这样的节点
queue.offer(mid.left);
//改变遍历状态
//后面节点必须都是叶子节点
tmp = true;
} else if (mid.left == null && mid.right != null) {
//检验结束,完全二叉树不可能出现只有右孩子没有左孩子的节点
return false;
} else {
//遇到第一个叶子节点,改变遍历状态
//后面节点必须都是叶子节点
tmp = true;
}
} else {
//第二种状态,剩下的节点必须都是叶子节点
if (mid.left != null || mid.right != null) {
return false;
}
}
}
//检验完毕
return true;
}