1.【基础题】–判断一棵树是否是完全二叉树。提示:层序遍历变型题。

(1)基础知识
【二叉树】:二叉树是一棵特殊的树,二叉树每个节点最多有两个孩子结点,分别称为左孩子和右孩子。

【满二叉树】:高度为N的满二叉树有2^N- 1个节点的二叉树。

【完全二叉树】: 若设二叉树的深度为h,除第h 层外,其它各层(1~h-1) 的结点数都达到最大个数,第h 层所有的结点都连续集中在最左边,这就是完全二叉树
【满二叉树是完全二叉树的特例】

(2)判断一棵树是否是完全二叉树的思路
1>如果树为空,则直接返回错
2>如果树不为空:层序遍历二叉树
2.1>如果一个结点左右孩子都不为空,则pop该节点,将其左右孩子入队列;
2.1>如果遇到一个结点,左孩子为空,右孩子不为空,则该树一定不是完全二叉树;
2.2>如果遇到一个结点,左孩子不为空,右孩子为空;或者左右孩子都为空;则该节点之后的队列中的结点都为叶子节点;该树才是完全二叉树,否则就不是完全二叉树;

(3)代码实现

#include<iostream>
using namespace std;
#include<queue>
template<class T>
struct TreeNode
{T data;TreeNode<T>*  left;TreeNode<T>*  right;TreeNode(const T& x):data(x),left(NULL),right(NULL){}
};----------
template<class T>
bool  IsComplete(TreeNode<T>* root)
{//1.树为空,返回错误if (root==NULL){return false;}//2.树不为空queue<TreeNode<T>*>  q;q.push(root);while (!q.empty()){TreeNode<T>* top=q.front();//2.1如果该节点两个孩子都有,则直接popif (top->left&&top->right){q.pop();q.push(top->left);q.push(top->right);}//2.2如果该节点左孩子为空,右孩子不为空,则一定不是完全二叉树if (top->left==NULL&&top->right){return false;}//2.3如果该节点左孩子不为空,右孩子为空或者该节点为叶子节点,则该节点之后的所有结点都是叶子节点if ((top->left&&top->right==NULL)||(top->left==NULL&&top->right==NULL)){q.pop();//则该节点之后的所有结点都是叶子节点while (!q.empty()){top=q.front();if (top->left==NULL&&top->right==NULL){q.pop();}else{return false;}}return true;}}return true;
}
----------//满二叉树
void test1()
{//       1//   2       3// 4    5  6   7TreeNode<int>* node1=new TreeNode<int>(1); TreeNode<int>* node2=new TreeNode<int>(2); TreeNode<int>* node3=new TreeNode<int>(3); TreeNode<int>* node4=new TreeNode<int>(4); TreeNode<int>* node5=new TreeNode<int>(5); TreeNode<int>* node6=new TreeNode<int>(6); TreeNode<int>* node7=new TreeNode<int>(7); node1->left=node2;node1->right=node3;node2->left=node4;node2->right=node5;node3->left=node6;node3->right=node7;cout<<IsComplete<int>(node1)<<endl;
}//二叉树为空
void test2()
{cout<<IsComplete<int>(NULL)<<endl;
}
//3.二叉树不为空,也不是满二叉树,遇到一个结点左孩子为空,右孩子不为空
void test3()
{//       1//   2       3// 4    5      7TreeNode<int>* node1=new TreeNode<int>(1); TreeNode<int>* node2=new TreeNode<int>(2); TreeNode<int>* node3=new TreeNode<int>(3); TreeNode<int>* node4=new TreeNode<int>(4); TreeNode<int>* node5=new TreeNode<int>(5); TreeNode<int>* node7=new TreeNode<int>(7); node1->left=node2;node1->right=node3;node2->left=node4;node2->right=node5;node3->right=node7;cout<<IsComplete<int>(node1)<<endl;
}//4.二叉树不为空,也不是满二叉树,遇到叶子节点,则该叶子节点之后的所有结点都为叶子节点
void test4()
{//        1//    2       3// 4    5      TreeNode<int>* node1=new TreeNode<int>(1); TreeNode<int>* node2=new TreeNode<int>(2); TreeNode<int>* node3=new TreeNode<int>(3); TreeNode<int>* node4=new TreeNode<int>(4); TreeNode<int>* node5=new TreeNode<int>(5); node1->left=node2;node1->right=node3;node2->left=node4;node2->right=node5;cout<<IsComplete<int>(node1)<<endl;
}
//4.二叉树不为空,也不是满二叉树,遇到左孩子不为空,右孩子为空的结点,则该节点之后的所有结点都为叶子节点
void test5()
{//        1//    2       3// 4    5   6 TreeNode<int>* node1=new TreeNode<int>(1); TreeNode<int>* node2=new TreeNode<int>(2); TreeNode<int>* node3=new TreeNode<int>(3); TreeNode<int>* node4=new TreeNode<int>(4); TreeNode<int>* node5=new TreeNode<int>(5); TreeNode<int>* node6=new TreeNode<int>(6); node1->left=node2;node1->right=node3;node2->left=node4;node2->right=node5;node3->left=node6;cout<<IsComplete<int>(node1)<<endl;
}
int main()
{test1();/*test2();*//*test3();*//*test4();*//*test5();*/return 0;
}

判断一棵树是否是完全二叉树相关推荐

  1. 数据结构与算法之判断一棵树是否为搜索二叉树、判断一棵树是否是完全二叉树

    数据结构与算法之判断一棵树是否为搜索二叉树.判断一棵树是否是完全二叉树 目录 判断一棵树是否为搜索二叉树 判断一棵树是否是完全二叉树 1. 判断一棵树是否为搜索二叉树 概念:搜索树就是中序遍历的结果是 ...

  2. 数据结构面试题/判断一棵树是否是完全二叉树

    二叉树: 1.满二叉树:在一棵二叉树中,如果所有分支节点都存在左子树和右子树,并且所有叶子节点都在同一层上. 2.完全二叉树:如果一棵具有N个结点的二叉树的结构与满二叉树的前N个结点的结构相同,称为完 ...

  3. 判断一棵树是否是搜索二叉树 判断一棵树是否是完全二叉树

    package class_04;import java.util.LinkedList; import java.util.Queue; /*** * 判断一棵树是否是搜索二叉树* 判断一棵树是否是 ...

  4. 判断一棵树是否为完全二叉树的算法c语言_[二叉树的面试算法](六)之二叉树结构判断-相关题型总结(4题)...

    在线oj练习地址 判断两棵二叉树是否相同_leetcode100 判断一棵树是否是平衡二叉树_leetcode110 翻转二叉树_leetcode226 判断一棵树是否为对称二叉树_leetcode1 ...

  5. 判断一棵树是否为完全二叉树的算法c语言_别再翻了,面试二叉树看这 11 个就够了!||CSDN博客精选...

    作者:一只不甘平凡的小鹿 数据结构与算法: 不知道你有没有这种困惑,虽然刷了很多算法题,当去面试的时候,面试官让你手写一个算法,可能你对此算法很熟悉,知道实现思路,但是总是不知道该在什么地方写,而且很 ...

  6. 判断一棵树是否为完全二叉树的算法c语言,判断是否为完全二叉树

    什么是二叉树(Binary Tree) 每个结点至多拥有两棵子树(即二叉树中不存在度大于2的结点),并且,二叉树的子树有左右之分,其次序不能任意颠倒. 二叉树包含三种特殊的二叉树,完全二叉树.完满二叉 ...

  7. 判断一颗树是否为完全二叉树

    题目链接:https://oj.ismdeep.com/contest/problem?id=1396&pid=7 H: CBT? 时间限制: 1 s      内存限制: 128 MB    ...

  8. 数据结构与算法之二叉树的序列化和反序列化及判断一棵树是否为平衡二叉树

    数据结构与算法之二叉树的序列化和反序列化及判断一棵树是否为平衡而二叉树 目录 二叉树的序列化和反序列化 判断一棵树是否为平衡而二叉树 1. 二叉树的序列化和反序列化 1. 递归版本序列化和反序列化 代 ...

  9. 数据结构-判断一棵树是否为二叉排序树

    判断一棵树是否为二叉排序树 二叉排序树的性质:如果按照中序遍历的方式遍历二叉排序树的话,遍历的数字是呈递增趋势的.我们根据这个思路去判断是否为二叉排序树. 思路: ①建树 ②设立一个变量去记录当前已经 ...

最新文章

  1. Redis创建高可用集群教程【Windows环境】
  2. 一则android软件开发工程师的招聘信息
  3. 字符串分割split
  4. tensorflow学习函数笔记
  5. 容器开启数据服务之旅系列(四):Kubernetes QoS 助力在线运用与大数据离线运用的带宽控制和磁盘控制...
  6. iqc工作职责和工作内容_猎头如何辨识工作职责和工作业绩?
  7. C# 容器重用避免GC 的论证
  8. python recv
  9. SDNU 1048.石子合并2(区间dp)
  10. appender log4j 扩展_Log4j扩展使用--输出地Appender
  11. Mongodb 集群实战
  12. python怎么定义全局变量_python中如何定义全局变量
  13. MySQL使用Navicat导出Excel时数字展示会变成科学计数法
  14. Android教程 第四章 用户界面设计基础
  15. python实现 Floyd算法求解最短路径距离问题
  16. 【基于JavaEE的医院药品管理系统的设计与实现】
  17. [个人笔记] ssh-keygen和openssl工具的使用
  18. Python批量裁剪图形外围空白区域-续
  19. Markdown排版微信公众号文章
  20. 《C语言及程序设计》实践参考——n=a!+b!+c!

热门文章

  1. vue + 微信公众号开发+腾讯地图定位显示附近商家多点标记并自定义标记样式
  2. CSS实例 简单案例
  3. 554 DT:SPM 163 smtp11
  4. birt使用quartz框架实现自动生成报表
  5. 华为服务器安装centos找不到硬盘,华为服务器CentOS 6.6安装手册
  6. 数据库建模 — ER建模
  7. php级差,团队级差分红系统说明(分销版)
  8. 零时 || 数字钱包该如何进行安全审计?
  9. 构建iOS持续集成平台(二)——测试框架
  10. BIM工程师就业方向前景如何?