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); } }