算法记录
LeetCode 题目:
给定一个二叉树,确定它是否是一个完全二叉树。
说明
一、题目
若设二叉树的深度为 h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。(注:第 h 层可能包含 1~ 2h 个节点。)
二、分析
- 题目也不难,关键是要明白完全二叉树的一些性质。
- 我们这里采用层次遍历的方式来判断,一旦我们的队列中出现了
null
,也就说明如果是一个完全二叉树,遍历已经到头了。 - 之后我们只需要对队列中的元素再进行一次遍历,看一下有没有非空的值即可。
- 在循环中可以采用一个小小的剪枝方法,也就是当左子树为空但是右子树不为空时,直接退出返回
false
,因为直接违背了完全二叉树的性质。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public boolean isCompleteTree(TreeNode root) {
if(root == null) return true;
Queue<TreeNode> queue = new LinkedList();
queue.add(root);
while(!queue.isEmpty()) {
final TreeNode temp = queue.poll();
if(temp == null) break;
if(temp.left == null && temp.right != null) return false;
queue.add(temp.left);
queue.add(temp.right);
}
while(!queue.isEmpty()) if(queue.poll() != null) return false;
return true;
}
}
总结
熟悉完全二叉树的性质和层次遍历的方法。