当前位置: 首页 > news >正文

数据结构--二叉树相关习题5(判断二叉树是否是完全二叉树 )

1.判断二叉树是否是完全二叉树 

辨别:

不能使用递归或者算节点个数和高度来判断。

满二叉树可以用高度和节点来判断,因为是完整的。

但是完全二叉树前面是满的,但是最后一层是从左到右连续这种

如果仍然用这种方法的话,如下图两个识别方法是一样的,但是无法准确识别

完全二叉树:前h-1层是满的,最后一层是从左到右连续。

如果走层序那么一定是连续的,也就是说要通过层序遍历来走。

思路:1.层序遍历走,空也进序列。

2.遇到第一个空时开始判断,如果后面都为空则是完全二叉树,若空后面还出席那非空的情况则说明不是完全二叉树。

代码实现:

//判断二叉树是否是完全二叉树
bool TreeComplete(BTNode* root)
{ Queue q;//仍然使用队列去实现QueueInit(&q);if (root)QueuePush(&q,root)while (!QueueEmpty){BTNode* front = QueueFront(&q);QueuePop(&q);//遇到第一个空就可以开始判断,如果队列中还有非空,就不是完全二叉树。if (front == NULL){break;}QueuePush(&q, front->left);QueuePush(&q, front->right);}while (!QueueEmpty){BTNode* front = QueueFront(&q);QueuePop(&q);//如果仍有非空元素,直接
//		return false;if (front){QueueDestroy(&q);//如果存在非空。return false;}QueueDestroy(&q);return true;
//最终QueueDestroy,再返回}
}

补充队列的一系列实现

void QueueInit(Queue* pq)
{assert(pq);pq->phead =  NULL;pq->ptail = NULL;pq->size = 0;
}void QueueDestroy(Queue* pq)
{assert(pq);QNode* cur = pq->phead;while (cur){QNode* next = cur->next;free(cur);cur = next;}pq->phead = pq->ptail = NULL;pq->size = 0;
}// 队尾插入
void QueuePush(Queue* pq, QDataType x)
{assert(pq);QNode* newnode = (QNode*)malloc(sizeof(QNode));if (newnode == NULL){perror("malloc fail");return;}newnode->next = NULL;newnode->val = x;if (pq->ptail == NULL){pq->phead = pq->ptail = newnode;}else{pq->ptail->next = newnode;pq->ptail = newnode;}pq->size++;
}// 队头删除
void QueuePop(Queue* pq)
{assert(pq);assert(pq->size != 0);/*QNode* next = pq->phead->next;free(pq->phead);pq->phead = next;if (pq->phead == NULL)pq->ptail = NULL;*/// 一个节点if (pq->phead->next == NULL){free(pq->phead);pq->phead = pq->ptail = NULL;}else // 多个节点{QNode* next = pq->phead->next;free(pq->phead);pq->phead = next;}pq->size--;
}QDataType QueueFront(Queue* pq)
{assert(pq);assert(pq->phead);return pq->phead->val;
}QDataType QueueBack(Queue* pq)
{assert(pq);assert(pq->ptail);return pq->ptail->val;
}int QueueSize(Queue* pq)
{assert(pq);return pq->size;
}
//判空
bool QueueEmpty(Queue* pq)
{assert(pq);return pq->size == 0;
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • uniapp如何发送websocket请求
  • Python函数 之 变量
  • 前端导出pdf
  • Science Advances 仿生双模态触觉感知
  • c++ 多边形 xyz 数据 获取 中心点方法,线的中心点取中心值搞定 已解决
  • PMON的解读和开发
  • java通过poi-tl导出word实战详细步骤
  • 视频使用操作说明书-T80005系列视频编码器如何对接海康NVR硬盘录像机,包括T80005系列高清HDMI编码器、4K超高清HDMI编码器
  • git diff,stash,submodule,format-patch
  • 自定义波形图View,LayoutInflater动态加载控件保存为本地图片
  • 上传图片,base64改为文件流,并转给后端
  • QT 图片处理
  • C#的DllImport使用方法
  • STM32智能空气质量监测系统教程
  • VUE与React的生命周期对比
  • Asm.js的简单介绍
  • ComponentOne 2017 V2版本正式发布
  • gf框架之分页模块(五) - 自定义分页
  • go语言学习初探(一)
  • HTTP传输编码增加了传输量,只为解决这一个问题 | 实用 HTTP
  • Java IO学习笔记一
  • java第三方包学习之lombok
  • nginx 配置多 域名 + 多 https
  • PAT A1017 优先队列
  • Python 基础起步 (十) 什么叫函数?
  • react 代码优化(一) ——事件处理
  • React+TypeScript入门
  • React组件设计模式(一)
  • Spring技术内幕笔记(2):Spring MVC 与 Web
  • Zsh 开发指南(第十四篇 文件读写)
  • 爱情 北京女病人
  • 闭包,sync使用细节
  • 翻译:Hystrix - How To Use
  • 分布式熔断降级平台aegis
  • 技术胖1-4季视频复习— (看视频笔记)
  • 如何在GitHub上创建个人博客
  • 算法-图和图算法
  • 突破自己的技术思维
  • puppet连载22:define用法
  • scrapy中间件源码分析及常用中间件大全
  • 小白应该如何快速入门阿里云服务器,新手使用ECS的方法 ...
  • ​Spring Boot 分片上传文件
  • ###STL(标准模板库)
  • (c语言+数据结构链表)项目:贪吃蛇
  • (PADS学习)第二章:原理图绘制 第一部分
  • (python)数据结构---字典
  • (pytorch进阶之路)扩散概率模型
  • (精确度,召回率,真阳性,假阳性)ACC、敏感性、特异性等 ROC指标
  • (论文阅读26/100)Weakly-supervised learning with convolutional neural networks
  • (免费领源码)python#django#mysql校园校园宿舍管理系统84831-计算机毕业设计项目选题推荐
  • (转载)(官方)UE4--图像编程----着色器开发
  • *算法训练(leetcode)第三十九天 | 115. 不同的子序列、583. 两个字符串的删除操作、72. 编辑距离
  • .NET C# 使用 SetWindowsHookEx 监听鼠标或键盘消息以及此方法的坑
  • .NET Standard / dotnet-core / net472 —— .NET 究竟应该如何大小写?
  • .net(C#)中String.Format如何使用