class TreeNode {
public int val;
public TreeNode left;
public TreeNode right;
public TreeNode(int val) {
this.val = val;
}
}
public class InterviewTree {
public boolean isCompleteTree(TreeNode root) {
if (root == null) {
return true;
}
boolean isSecondStep = false;
// 针对这个树进行层序遍历
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
while (!queue.isEmpty()) {
TreeNode cur = queue.poll();
// 针对当前节点进行访问(判断是否符合完全二叉树的要求)
if (!isSecondStep) {
// 这是第一阶段
if (cur.left != null && cur.right != null) {
// 直接把这两个子树入队列即可
queue.offer(cur.left);
queue.offer(cur.right);
} else if (cur.left == null && cur.right != null) {
// 当前第一阶段中某个节点只有右子树, 没有左子树. 一定不是完全二叉树
return false;
} else if (cur.left != null && cur.right == null) {
// 切换到第二阶段
isSecondStep = true;
queue.offer(cur.left);
} else {
// 左右子树都为空, 也要切换到第二阶段
isSecondStep = true;
}
} else {
// 这是第二阶段
// 要求第二阶段中任何一个节点都必须没有子树.
// 只要找到某个节点带子树, 就说明找到了反例
if (cur.left != null || cur.right != null) {
return false;
}
}
}
// 整个树都遍历完了, 也没找到反例, 最终就 return true. 认为就是完全二叉树.
return true;
}
}
判断是否为完全二叉树
最新推荐文章于 2023-12-28 13:34:32 发布