层序遍历

从所在二叉树的根节点出发,首先访问第一层的树根节点,然后从左到右访问第二层上的节点,接着是第三层的节点,以此类推,自上而下,自左至右逐层访问树的节点的过程。

while(队列!=NULL)
{
1.从空间中取出一个节点cur,进行遍历
2.如果cur有左孩子,将其保存
3.如果cur有右孩子,将其保存
4.将刚刚遍历的节点从空间中删除掉
}

判断是否为完全二叉树

#include<stdio.h>
#include<assert.h>
#include<stdlib.h>typedef struct BTNode
{struct BTNode* left;struct BTNode* right;int data;
}BTNode;typedef struct BTNode* QDataType;typedef struct QNode
{QDataType data;struct QNode* next;
}QNode;//队列的结构
typedef struct Queue
{QNode* front;   //指向队头QNode* back;    //指向队尾
}Queue;
//队列结构初始化
void QueueInit(Queue* q)
{assert(q);q->front = NULL;q->back = NULL;
}
//队列删除元素(头删)
void QueuePop(Queue* q)
{assert(q);//空链表,直接返回if (QueueEmpty(q)){return;}//只有一个节点else if (q->front == q->back){free(q->front);q->front = NULL;q->back = NULL;}//多个节点(头删)else{QNode* delNode = q->front;q->front = q->front->next;free(delNode);}
}
//队列是否为空
int QueueEmpty(Queue* q)
{assert(q);return q->front == NULL;
}
//查询队头(保证必须有元素)
QDataType QueueFront(Queue* q)
{assert(q);return q->front->data;
}
//销毁队列(头删)
void QueueDestroy(Queue* q)
{QNode* cur = q->front;while (cur){q->front = q->front->next;free(cur);cur = q->front;}//当所有元素删完,队列成为空队列q->front = NULL;q->back = NULL;
}
//二叉树层序遍历
void BinaryLevelOrder(BTNode* root)
{if (root == NULL)return;//层序遍历需要借助队列Queue q;QueueInit(&q);//将树的根节点如果队列,然后当队列不空时,循环进行操作QueuePush(&q, root);while (!QueueEmpty(&q)){struct BTNode* cur = QueueFront(&q);//将该节点遍历printf("%d", cur->data);//如果cur有左孩子则入队,如果有右孩子则入队if (cur->left)QueuePush(&q, cur->left);if (cur->right)QueuePush(&q, cur->right);QueuePop(&q);}QueueDestroy(&q);printf("/n");
}//是否为完全二叉树
int BinaryTreeComplete(BTNode* root)
{//空树也是完全二叉树if (root = NULL)return 1;//按照层序遍历的方式找到第一个不饱和的节点Queue q;int flag = 0;//标记第一个不饱和节点的位置int CompleteTree = 1;QueueInit(&q);QueuePush(&q, root);while (QueueEmpty(&q)){BTNode* cur = QueueFront(&q);QueuePop(&q);//队列中删除if (flag)//找到第一个不饱和节点{//不饱和节点之后所有的节点不能有孩子if (cur->left || cur->right){CompleteTree = 0;break;}}else//寻找第一个不饱和节点{//检测cur是否为饱和的节点:一个的两个孩子为饱和节点if (cur->left && cur->right){QueuePush(&q, cur->left);QueuePush(&q, cur->right);}else if (cur->left)//只有左孩子{//找到第一个不饱和节点QueuePush(&q, cur->left);flag = 1;}else if (cur->right)//只有右孩子{CompleteTree = 0;break;}else//cur左右孩子都不存在 {flag = 1;}}}QueueDestroy(&q);return CompleteTree;
}

数据结构:二叉树层序遍历和判断是否为完全二叉树相关推荐

  1. 二叉树的进阶操作---(求二叉树中所有结点个数,求叶子结点个数,求第k层结点个数;在二叉树中查找某一结点;层序遍历;判断是否为完全二叉树)

    typedef struct TreeNode {struct TreeNode *left;struct TreeNode *right;char val; }TreeNode;typedef st ...

  2. 【LeetCode】专题一 二叉树层序遍历

    二叉树层序遍历 在本文中,我将会选取LeetCode上二叉树层序遍历的多道例题,并给出解答,通过多道题我们就可以发现,二叉树的层序遍历并不复杂,并且有着共通点. 102. 二叉树的层序遍历 给你二叉树 ...

  3. 二叉树层序遍历_求二叉树的层序遍历

    题目描述 给定一个二叉树,返回该二叉树层序遍历的结果,(从左到右,一层一层地遍历) 例如: 给定的二叉树是{3,9,20,#,#,15,7}, 该二叉树层序遍历的结果是 [ [3], [9,20], ...

  4. 牛客-二叉树层序遍历

    牛客-二叉树层序遍历 #include <stdio.h> #include <queue> #include <stack> #include <math. ...

  5. 二叉树层序遍历分层[递归迭代两种思想+三种解法]

    层序遍历分层的递归迭代解法 前言 一.二叉树层序遍历分层 二.递归与迭代 总结 参考文献 前言 层序遍历作为二叉树遍历的基本遍历,一般来说只能用迭代来解.但是分层输出则既可用迭代,又可配合level用 ...

  6. 二叉树层序遍历(广度优先搜索)基础概念与经典题目(Leetcode题解-Python语言)

    二叉树的广度优先搜索即从上到下.从左到右地进行搜索,对于层序遍历(Level Order)问题,即依次遍历第一层节点.第二层节点-等,基本可以秒杀. 广度优先搜索是通过队列来实现的,python中优先 ...

  7. BFS(二)二叉树层序遍历(I、II)、二叉树锯齿形层序遍历、N叉树层序遍历

    目录 102. 二叉树的层序遍历 107. 二叉树的层序遍历 II 103. 二叉树的锯齿形层序遍历 429. N 叉树的层序遍历 102. 二叉树的层序遍历 给你二叉树的根节点 root ,返回其节 ...

  8. 二叉树层序遍历——java

    目录 一.题目 二.层序遍历顺序 三.思路(迭代法) 四.代码实现 一.题目 1.链接:力扣 2.内容:给你二叉树的根节点 root ,返回其节点值的 层序遍历 . (即逐层地,从左到右访问所有节点) ...

  9. 二叉树层序遍历(c语言,非递归)

    层序遍历的作用是将二叉树,从上到下,从左到右依次遍历.如下图遍历的结果是A->B->C->D->E->F->G->H.其实,这就相当于族谱一样,从辈分大到小遍 ...

最新文章

  1. mern技术栈好处?_通过构建运动追踪器应用程序来学习MERN堆栈(MERN教程)
  2. SHOI2008仙人掌图(tarjan+dp)
  3. HDU 1008 Elevator
  4. iOS 集成银联支付swift
  5. Google protobuf使用技巧和经验
  6. Java开发必须掌握的日志分析命令
  7. java 保留字符串,如何在Java中保留字符串而不使用反转功能
  8. powerbi内部部署安装指导
  9. 多个Excel合并为一个Excel表
  10. 地图比例尺与空间分辨率之间的关系_地图比例尺,分辨率,dpi之间的关系
  11. 计算机信息安全认识实习报告
  12. 百度apollo自动驾驶modules\planning\tasks\optimizers\path_time_heuristic\PathTimeHeuristicOptimizer类代码详解
  13. 天虹办公系统kk服务器,客户齐点赞,蓝凌KK 7.0大幅提升工作效率
  14. java支付逻辑_java 订单支付status逻辑
  15. 杭州电子科技大学程序设计竞赛(2016’12)- 网络同步赛 1004
  16. day21组合III电话号码的字母组合
  17. 嵌入式linux音频播放器设计,基于嵌入式Linux下Madplay音频播放器设计论文.docx
  18. 在linux中使用getch()函数
  19. 中国计算机仿真行业全景调查与投资策略建议报告2022-2028年版
  20. SOLIDWORKS Simulation攻略丨赫兹接触应力分析

热门文章

  1. win10远程桌面设置计算机,win10设置远程桌面连接的方法_win10如何设置远程桌面连接...
  2. SoC EDS 17.0 和 DS-5 下载和安装
  3. 电池最耐用 android,聊聊手机几年一换最合适,安卓机用三年最不划算
  4. 在学期初小结本学期要做的事情
  5. 后台管理系统的顶部tab标签制作(学习使用)
  6. 包package详解
  7. easyuefi如何添加引导_EasyUEFI(轻松管理EFI/UEFI启动项) 4.0附带使用方法企业版_EasyUEFI(轻松管理EFI/UEFI启动项) 下载-PC9软件园...
  8. LTE-A载波聚合技术(1)---载波聚合的技术特征、分类、仿真场景
  9. 前端MVC/MVP/MVVM示例
  10. 河北省中小学计算机教室管理制度,河北省中小学计算机教室管理制度.doc