目录
一、二叉树的完全性检验
这道题目需要分阶段:将一颗完全二叉树看做两个阶段。
阶段一:此时的节点都是度为2的结点,当碰到第一个只有左子树没有右子树或者叶子结点,从该结点之后的结点应该都在二叉树。
阶段二:此时的节点全都是叶子结点,碰到一个反例直接return false。
当遇到一个结点只有右子树,那么直接return false。
所以首先判断树是否只有一个结点,root.left ==null&&root.right==null如果满足这个条件那么直接返回true。
主要就是根据层序遍历入队出队进行判断是否是完全二叉树,所以首先创建一个对列deque,将根节点入队,然后设置一个两边isSecondStep来判断是否在第二阶段。
然后进行出队并且将出队元素存储起来,然后进行判断现在是哪个阶段,这时是第一阶段,若左右子树都不为空,那么就让他们的左右子树入队即可。
然后继续出队,这时还是第一阶段,左右子树都不为空,让他们的左右子树入队。
然后继续出队,这时还是第一阶段,但是这个时候左子树不为空右子树为空,所以进入第二阶段设置isSecondStep为true,然后将左子树入队。
这时在进入循环就是第二阶段了,判断每个出队元素的左右子树是否都为空,若不是那么立即返回false。进行到最后了就返回isSecondStep即可。
public boolean isCompleteTree(TreeNode root) {
if(root.left ==null&&root.right==null){
return true;
}
Deque<TreeNode> deque = new LinkedList<>();
deque.offer(root);
boolean isSecondStep = false;