tag: 二叉树 - 完全二叉树
思路: 层次遍历二叉树,一旦某个节点没有左孩子或右孩子,则队列中接下来的节点不能有孩子。
package com.zhaochao.tree;
import java.util.LinkedList;
import java.util.Queue;
/**
* Created by zhaochao on 17/1/25.
* wiki definition:
* A complete binary tree in which every level, except possibly the last level, is completed filled, and all nodes
* are as far left as possible.
* 翻译成中文: 一个完全二叉树,除了最后一层外,每层都被节点填满,且最后一层的节点都全部靠左。
*
* 解题思路:
* 完全二叉树具备如下特点,当层次遍历遇到第一个节点且其左孩子为空时,那么该节点的右孩子一定为空,且接下来队列中的节点不会有孩子,
*/
public class JudgeCompleteBT {
public boolean isCompleteBT(TreeNode root) {
if(root == null) {
return true;
}
boolean noChild = false;
Queue<TreeNode> queue = new LinkedList<TreeNode>();
queue.offer(root);
while(!queue.isEmpty()) {
TreeNode curr = queue.poll();
if(curr.left != null) {
// 如果标记被设置,则Queue中任何元素不应再有子元素。
if(noChild) {
return false;
}
queue.offer(curr.left);
} else {
// 一旦某元素没有左节点或是右节点,则之后所有的元素都不应有子元素。
// 并且该元素不可以有右节点.
noChild = true;
}
if(curr.right != null) {
// 如果标记被设置,则Queue中任何元素不应再有子元素。
if(noChild) {
return false;
}
queue.offer(curr.right);
} else {
// 一旦某元素没有左节点或是右节点,则之后所有的元素都不应有子元素
noChild = true;
}
}
return true;
}
public static void main(String[] args) {
TreeNode root = new TreeNode(0);
TreeNode node1 = new TreeNode(1);
TreeNode node2 = new TreeNode(2);
TreeNode node3 = new TreeNode(3);
TreeNode node4 = new TreeNode(3);
root.left = node1;
root.right = node2;
node1.left = node3;
node2.right = node4;
JudgeCompleteBT test = new JudgeCompleteBT();
boolean result = test.isCompleteBT(root);
System.out.println(result);
}
}