题目概述(简单难度)
给定一个二叉树,确定它是否是一个完全二叉树。
百度百科中对完全二叉树的定义如下:
若设二叉树的深度为 h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。(注:第 h 层可能包含 1~ 2 h 2^{h}2
h
个节点。)
示例 1:
输入:[1,2,3,4,5,6] 输出:true 解释:最后一层前的每一层都是满的(即,结点值为 {1} 和 {2,3} 的两层),且最后一层中的所有结点({4,5,6})都尽可能地向左。
示例2:
输入:[1,2,3,4,5,null,7] 输出:false 解释:值为 7 的结点没有尽可能靠向左侧。
提示:
树中将会有 1 到 100 个结点。
题目链接:
点我进入leetcode
思路与代码
思路展现
我们来看完全二叉树的判断,判断一棵树是否为完全二叉树的思路我们还是沿用层序遍历的思路,只不过我们是判断每次从队列出来的队头元素和剩余队列中的元素是否为空,当满足从队列出来的队头元素为空和剩余队列中的元素不为空的情况,就说明其不是一个完全二叉树,下面来看代码实现:
关于层序遍历的思路可以参考这篇博客:
点我进入博客
同时给大家拓展了leetcode中关于层序遍历的题目,戳下面的链接便可以进入对应博客:
点我进入博客
代码示例
class Solution { public boolean isCompleteTree(TreeNode root) { if(root == null) { return true; } Queue<TreeNode> queue = new LinkedList<>(); queue.offer(root); TreeNode cur1 = root; while(!queue.isEmpty()) { TreeNode cur = queue.poll(); if(cur != null) { queue.offer(cur.left); queue.offer(cur.right); }else { //发现为空直接跳出循环 break; } } //此时判断队列剩下的是否还有元素,如果有,说明不是完全二叉树 while(!queue.isEmpty()) { TreeNode node = queue.peek(); if(node != null) { return false; }else { queue.poll(); } } return true; } }
时间复杂度:O(N)
其中 N 是树节点个数。
空间复杂度:O(N)
总结
此题考察对于完全二叉树的完全性的检验,用到的思路是层序遍历的思路的变形,小伙伴们可以把这道题目与之前层序遍历的那道题目进行一个结合对比,从而掌握其中的精髓.