对于完全二叉树,这里给一个来自百度百科的描述: 若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。
我们可以根据题意做题即可,我们可以采用分层遍历的方式,在判断一个具体的节点的时候,我们可以有如下的判断依据:
(1).如果这个节点的左子树为null,右子树不为null,则一定不是完全二叉树。
(2).如果这个节点的左右子树均为null,或者这个节点的左子树不为null但是右子树为null,则当前层或者下一层不能再出现含有左右子树的节点。
(3).如果当前节点的左右子树均不为null,则观察下一个节点。
只要确认这个思路没问题,接下来就是把代码写出来了。代码实现也比较简单,我们这里给出代码实现:
package com.mengzhidu.teach.algorithm.tree.demo.basic;
import com.mengzhidu.teach.algorithm.tree.demo.TreeNode;
import com.mengzhidu.teach.algorithm.tree.demo.TreeNodeHelper;
import java.util.ArrayDeque;
import java.util.Queue;
/**
* 判断一棵树是否为完全二叉树
* 所谓完全二叉树,就是只有最后两层可以是叶子节点
*/
public class CompleteTreeDemo {
public static void main(String[] args) {
TreeNode node = TreeNodeHelper.getTreeNode();
boolean result = isCompleteTree(node);
System.out.println("结果是:" + result);
}
private static boolean isCompleteTree(TreeNode node) {
if (node == null) {
return false;
}
boolean hasLeaf = false;
Queue<TreeNode> queue = new ArrayDeque<>();
queue.add(node);
while (!queue.isEmpty()) {
TreeNode tmp = queue.poll();
if (tmp.getLeft() == null) {
if (tmp.getRight() != null) {
return false;
}
if (tmp.getRight() == null) {
hasLeaf = true;
}
} else {
if (hasLeaf) {
return false;
}
if (tmp.getRight() == null) {
hasLeaf = true;
queue.add(tmp.getLeft());
}
if (tmp.getRight() != null) {
queue.add(tmp.getLeft());
queue.add(tmp.getRight());
}
}
}
return true;
}
}