给定一个二叉树,确定它是否是一个完全二叉树。

百度百科中对完全二叉树的定义如下:

若设二叉树的深度为 h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。(注:第 h 层可能包含 1~ 2h 个节点。)

示例 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. 树中将会有 1 到 100 个结点。

个人递归方法:

class Solution {
bool isTheEnd = false;
int depth = 0;
public:
bool isCompleteTree(TreeNode* root)
{
if (root == NULL)
return true;
depth = GetDepth(root);
return GetAns(root, 1);
} int GetDepth(TreeNode *root)
{
if (root == NULL)
return 0;
return max(GetDepth(root->left), GetDepth(root->right)) + 1;
} bool GetAns(TreeNode *root, int dep)
{
//只有根节点的情况,不用判空,因为不会递归到那
if (dep == depth)
{
return true;
}
if (dep < depth - 1)
{
if (root->left == NULL || root->right == NULL)
return false;
return GetAns(root->left, dep + 1) && GetAns(root->right, dep + 1);
}
else if (dep == depth - 1)
{
if (isTheEnd)
{
if (root->left != NULL || root->right != NULL)
return false;
return true;
}
else
{
if (root->left == NULL)
{
if (root->right != NULL)
return false;
isTheEnd = true;
return true;
}
if (root->right == NULL)
{
isTheEnd = true;
return true;
}
return true;
}
}
}
};

广度优先遍历法(推荐):

bool isCompleteTree(TreeNode* root) {
queue<TreeNode *> que;
que.push(root);
while(!que.empty())
{
TreeNode * node = que.front();
que.pop();
if(!node)
{
break;
}
else
{
que.push(node->left);
que.push(node->right);
}
}
while(!que.empty())
{
TreeNode * node=que.front();
if(node)
return false;
que.pop();
}
return true;
}

最新文章

  1. 设计模式(十):从电影院中认识&quot;迭代器模式&quot;(Iterator Pattern)
  2. make: *** [out/host/linux-x86/obj/EXECUTABLES/aidl_intermediates/aidl] 错误 1,make: *** [out/host/linux-x86/obj/lib/libESR_Portable.so] 错误 1
  3. asp.net mvc5 伪静态
  4. Android中的Activity相关知识总结
  5. TopCoder
  6. SQL Server 2005中的分区表(二):如何添加、查询、修改分区表中的数据(转)
  7. 【五】PHP数组操作函数
  8. C#调用R语言输出图片
  9. FindLetter 类——查找文件中特定的字符,每一行开头为某一个字符,则跳过
  10. outlook 当关闭时最小化到任务栏完美的解决方案
  11. opencv----彩色图像对比度增强
  12. Java课程设计——GUI密码生成器201521123035
  13. Java虚拟机学习笔记——JVM垃圾回收机制
  14. Python3 tkinter基础 Menu Frame 创建右键菜单
  15. stenciljs 学习十一 pwa 支持
  16. jquery综合练习--模态对话框传值,删除,新增表格行
  17. devise在引擎中安装后,设置访问自定义页面
  18. JAVA在语言级支持多线程
  19. poj 2229 Sumsets 完全背包求方案总数
  20. 15 Django组件-中间件

热门文章

  1. soapui打开即报错------连接不上Internet
  2. 贪心+MST——cf1095F
  3. (转)JNI入门教程之HelloWorld篇 .
  4. 牛客多校第五场 G subsequence 1 最长公共子序列/组合数
  5. .net core, docker 在vs2019开发过程中的问题以及解决办法
  6. angluar1.8.2 PC Mail项目笔记
  7. private变量引用问题
  8. 第二篇:怕碰到是因为没掌握,来吧,zTree!
  9. &lt;每日一题&gt;算法题:小球的下落距离
  10. 透视jvm之垃圾回收