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. [MFC]多线程传参问题 [AfxBeginThread]
  2. sess.run()详解
  3. 二维数组 赋值_3.9数组(数组基本使用、数组的循环、数组拷贝、数组排序、多维数组)...
  4. python spark进行大数据分析_第2天Python实战Spark大数据分析及调度-RDD编程
  5. webservice用cxf发布SOAP
  6. 前端学习(555):margin与容器的尺寸
  7. layer右下脚弹窗
  8. jquery删除替换元素remove、detach、empty、replaceWith、replaceAll
  9. Git储藏和引用日志
  10. IATF16949:2016汽车质量管理体系认证办理流程
  11. 网站部署——基于Django框架的天天生鲜电商网站项目系列博客(十六)
  12. enfp工具箱怎么用_小丸工具箱使用技巧详细图解,值得各位学习
  13. 青花瓷抓HTTPS数据
  14. Redis 的过期策略都有哪些?
  15. DELL D630 显卡门事件 终于碰上了~
  16. 用于热水器行业气密性检测的五款快速密封接头
  17. 解决eclipse安装Darkest Dark Theme报错
  18. 山石网科面经(附参考回答)
  19. 升级扩散模型!一步成图,1秒18张,OpenAI开源
  20. 方法教程 | Python爬虫:爬取风景图片

热门文章

  1. C++(2)——成绩分层
  2. 基于VScode的ESP32开发学习(二):官方例程softap,提供wifi,详解
  3. 天天生鲜 smtplib.SMTPDataError: (554, b'DT:SPM 163 smtp13
  4. 神奇兔子数列:斐波那契数列
  5. 程序员由于天天和逻辑打交道,所以在世故的人眼里往往显得过于简单。
  6. python入门推荐
  7. 蓝牙青凤例程编译散记
  8. 计算机二级一般容易过的是什么情况,计算机二级哪个最容易考过
  9. Python3零基础入门学习视频+源码+课件+习题
  10. matlab 删除行或列时出现:矩阵索引超出删除范围 问题的解决和新思路