数据结构——二叉树的层次遍历进阶
之前的一个博客
数据结构——二叉树的层次遍历看完这个,可以简单实现下面的问题
问题:
1.计算二叉树的最大宽度(二叉树的最大宽度是指二叉树所有层中结点个数的最大值。
2.用按层次顺序遍历二叉树的方法,统计树中具有度为1的结点数目。
解决问题的思路:
- int BiTree_height1(BiTree T)函数用于计算出树的高度(深度);
- void levelOrder( BiTree T);创建了一个记录每层树的宽度数组width[totalLevel]
- void printNodeAtLevel(BiTree T,int level,int *width,int static_level) ;参数:有宽度数组的指针,和静态的层数(因为level会因为函数递归而改变,所以建立这一个)函数主体记录每一层节点数
- void levelOrder2(const BiTree T);设立一个变量,统计单分支结点的个数
- void printNodeAtLevel2(BiTree T,int level,int *single_branch);
核心代码
int BiTree_height1(BiTree T)//求树的深度算法1
{if(T==NULL)return 0;else{if(BiTree_height1(T->lchild)>BiTree_height1(T->rchild))return 1+BiTree_height1(T->lchild);elsereturn 1+BiTree_height1(T->rchild);}}
void printNodeAtLevel(BiTree T,int level,int *width,int static_level)
{ if(T==NULL||level<0) return; if(level==0) { printf("%c ",T->data);width[static_level]++;return; } // 左子树的 level - 1 级 printNodeAtLevel(T->lchild,level-1,width,static_level); // 右子树的 level - 1 级 printNodeAtLevel(T->rchild,level-1,width,static_level);
}void levelOrder( BiTree T)
{if(T==NULL)return;int totalLevel = BiTree_height1(T);int width[totalLevel]={0};for(int i = 0; i< totalLevel; i++){printNodeAtLevel(T, i,width,i);printf("\t\t\t第%d层的宽度为:%d",i,width[i]);printf("\n");//打印完一层,换行}int max_width=width[0],max=1;for(int j=1;j<totalLevel;j++){if(width[j]>max_width){max_width=width[j];max=j+1;}}printf("最大宽度为%d,首先出现最大宽度的是第%d层",max_width,max);} void printNodeAtLevel2(BiTree T,int level,int *single_branch)
{ if(T==NULL||level<0) return; if(level==0) { printf("%c ",T->data);if(T->lchild==NULL&&T->rchild!=NULL||T->lchild!=NULL&&T->rchild==NULL)//单分支时 single_branch[1]++; return; } // 左子树的 level - 1 级 printNodeAtLevel2(T->lchild,level-1,single_branch); // 右子树的 level - 1 级 printNodeAtLevel2(T->rchild,level-1,single_branch);
}void levelOrder2(const BiTree T)
{if(T==NULL)return;int totalLevel = BiTree_height1(T);int single_branch[1]={0};for(int i = 0; i< totalLevel; i++){printNodeAtLevel2(T, i,single_branch);printf("\n");//打印完一层,换行}printf("该树的单分支节点(即度为1的节点)数为:%d",single_branch[1]);}
全部代码(可直接执行)
#include<stdio.h>
#include<bits/stdc++.h> typedef char TElemType;
typedef int status;
typedef struct BiNode
{TElemType data;struct BiNode *lchild;struct BiNode *rchild;
}BiNode,*BiTree;
void CreateBiTree(BiTree &T)//二叉树的先序创建
{TElemType ch;scanf("%c",&ch);if(ch=='#')T=NULL;else {T=(BiNode*)malloc(sizeof(BiNode));if(!T)exit(-1);T->data=ch;CreateBiTree(T->lchild);CreateBiTree(T->rchild);}
}void DestroyBiTree(BiTree &T)//二叉树的销毁算法
{if(T==NULL)exit(-1);else{DestroyBiTree(T->lchild);DestroyBiTree(T->rchild);free(T);}
}int preorderTraverse(BiTree T)//二叉树的先序递归遍历算法
{if(T==NULL)return 0;else {printf("%c ",T->data);preorderTraverse(T->lchild);preorderTraverse(T->rchild);}} int InorderTraverse(BiTree T)//二叉树的中序递归遍历算法
{if(T==NULL)return 0;else {InorderTraverse(T->lchild);printf("%c ",T->data);InorderTraverse(T->rchild);}}int PostorderTraverse(BiTree T)//二叉树的后序递归遍历算法
{if(T==NULL)return 0;else {PostorderTraverse(T->lchild);PostorderTraverse(T->rchild);printf("%c ",T->data);}}int BiTree_height1(BiTree T)//求树的深度算法1
{if(T==NULL)return 0;else{if(BiTree_height1(T->lchild)>BiTree_height1(T->rchild))return 1+BiTree_height1(T->lchild);elsereturn 1+BiTree_height1(T->rchild);}}
void printNodeAtLevel(BiTree T,int level,int *width,int static_level)
{ if(T==NULL||level<0) return; if(level==0) { printf("%c ",T->data);width[static_level]++;return; } // 左子树的 level - 1 级 printNodeAtLevel(T->lchild,level-1,width,static_level); // 右子树的 level - 1 级 printNodeAtLevel(T->rchild,level-1,width,static_level);
}void levelOrder( BiTree T)
{if(T==NULL)return;int totalLevel = BiTree_height1(T);int width[totalLevel]={0};for(int i = 0; i< totalLevel; i++){printNodeAtLevel(T, i,width,i);printf("\t\t\t第%d层的宽度为:%d",i,width[i]);printf("\n");//打印完一层,换行}int max_width=width[0],max=1;for(int j=1;j<totalLevel;j++){if(width[j]>max_width){max_width=width[j];max=j+1;}}printf("最大宽度为%d,首先出现最大宽度的是第%d层",max_width,max);} void printNodeAtLevel2(BiTree T,int level,int *single_branch)
{ if(T==NULL||level<0) return; if(level==0) { printf("%c ",T->data);if(T->lchild==NULL&&T->rchild!=NULL||T->lchild!=NULL&&T->rchild==NULL)//单分支时 single_branch[1]++; return; } // 左子树的 level - 1 级 printNodeAtLevel2(T->lchild,level-1,single_branch); // 右子树的 level - 1 级 printNodeAtLevel2(T->rchild,level-1,single_branch);
}void levelOrder2(const BiTree T)
{if(T==NULL)return;int totalLevel = BiTree_height1(T);int single_branch[1]={0};for(int i = 0; i< totalLevel; i++){printNodeAtLevel2(T, i,single_branch);printf("\n");//打印完一层,换行}printf("该树的单分支节点(即度为1的节点)数为:%d",single_branch[1]);}
int main()
{BiTree T;printf("创建树输入树T的先序序列(其中使用#代表空节点)\n");CreateBiTree(T);printf("先序遍历算法");preorderTraverse(T);printf("\n中序遍历算法");InorderTraverse(T);printf("\n后序遍历算法");PostorderTraverse(T);printf("\n二叉树层次遍历算法\n");levelOrder(T);printf("\n二叉树层次遍历算法\n");levelOrder2(T);}
例如:
数据结构——二叉树的层次遍历进阶相关推荐
- 数据结构——二叉树的层次遍历
问题描述: 给你一个二叉树,请你返回其按 层序遍历 得到的节点值. (即逐层地,从左到右访问所有节点). 示例: 二叉树:[3,9,20,null,null,15,7] 返回其层次遍历结果: [ [3 ...
- 6-5 二叉树的层次遍历 (6分)_数据结构实验5_羊卓的杨
6-5 二叉树的层次遍历 (6分) 本题要求实现给定的二叉树的层次遍历. 函数接口定义: void Levelorder(BiTree T); T是二叉树树根指针,Levelorder函数输出给定二叉 ...
- 数据结构——二叉树的递归遍历算法与非递归遍历算法+层次遍历算法
(文章篇幅有点长,二叉树的递归遍历算法不作详细分析,但是二叉树的非递归遍历算法和层次遍历算法都有非常详细的分析过程,记得往下翻哦!) 二叉树的递归遍历算法实现 我们首先用递归的方法先序遍历创建这样一棵 ...
- leetcode-102 二叉树的层次遍历
给定一个二叉树,返回其按层次遍历的节点值. (即逐层地,从左到右访问所有节点). 例如: 给定二叉树: [3,9,20,null,null,15,7] 3 / \ 9 20 / \ 15 7 返回其层 ...
- c++根据二叉树的层次遍历建立二叉树_LeetCode | 102.二叉树的层次遍历
这次来写一下 LeetCode 的第 102 题,二叉树的层次遍历. 题目描述 题目直接从 LeetCode 上截图过来,题目如下: 102.二叉树的层次遍历题目 上面的题就是 二叉树的层次遍历 题目 ...
- 二叉树的层次遍历_【腾讯面试热身题】二叉树层次遍历(动画展示)
二叉树的层次遍历同时涉及到树和队列两种数据结构的操作,因此大厂很喜欢用来作为面试的热身题.作者不少去腾讯的小伙伴,都反映,这种题一定要非常熟练,不然会被直接pass. 1 题目描述 给定一个二叉树,按 ...
- 二叉树层次遍历c语言_每日一道 LeetCode (23):二叉树的层次遍历 II
❝ 每天 3 分钟,走上算法的逆袭之路. ❞ 前文合集 每日一道 LeetCode 前文合集 代码仓库 GitHub:https://github.com/meteor1993/LeetCode Gi ...
- 按层次遍历二叉树_LeetCode | 102.二叉树的层次遍历
这次来写一下 LeetCode 的第 102 题,二叉树的层次遍历. 题目描述 题目直接从 LeetCode 上截图过来,题目如下: 上面的题就是 二叉树的层次遍历 题目的截图,同时 LeetCode ...
- 关于二叉树的层次遍历的花样(c++实现)
花样变形1::二叉树层次遍历但是分层打印 分析:与普通打印多了一个分层打印,其实只要在在层次遍历中多设置一个标记变量即可 代码如下: //二叉树的层次遍历 void levelTravel(BTNod ...
最新文章
- 华科发布报告:41%研究生学霸是单身!
- IBM强化Watson对商业语言的理解能力—AI辩论一些关键技术首次商业化
- Chkdsk 工具将自动启动时启动的运行 Windows XP Service Pack 2 计算机扫描磁盘
- VSCode中experimentalDecorators设置问题
- 07-CoreData清除所有数据
- No execution.target specified in your configuration file.
- CIKM 2021 | AutoHERI: 基于层次表示自动聚合的 CVR 预估模型
- Android获取本机号码及运营商
- java中nonce_java如何获取微信timestamp,nonceStr,signature参数
- JPA 系列教程21-JPA2.0-@MapKeyColumn
- Android下Cocos2d创建HelloWorld工程
- Kafka监控KafkaOffsetMonitor【转】
- Win10专业版下如何禁用Windows Defender功能?
- #16192董哥授课的CCNP交换部分总结(三)
- 如何生成网站地图(Sitemap)
- python爬去新浪微博_Python爬取新浪微博热搜榜
- 我对于微信文章的感悟
- mahout第一篇-----Mahout学习路线图
- U盘和电脑USB都是好的,可是插上u盘没任何反应!
- Msc.Marc的python开发#2
热门文章
- 配置高性能ElasticSearch集群的9个小贴士
- ASP.NET Core 中文文档 第三章 原理(1)应用程序启动
- JetBrains 加入 .NET 基金会
- Python3.6学习笔记(四)
- 几行代码搞定树形文本转XML和JSON
- Android之PC浏览器上传表单格式大文件到手机客户端read函数阻塞问题
- C++之‘malloc’ was not declared in this scope和invalid conversion from ‘void*’ to ‘char*’
- 《零基础看得懂的C语言入门教程 》——(十)C语言的指针原来是这样
- php之clone 复制对象以及__clone魔术方法
- c 正则提取html,c – 正则表达式以获取HTML表格内容