数据结构——二叉树的层次遍历进阶

之前的一个博客
数据结构——二叉树的层次遍历看完这个,可以简单实现下面的问题

问题:

1.计算二叉树的最大宽度(二叉树的最大宽度是指二叉树所有层中结点个数的最大值。
2.用按层次顺序遍历二叉树的方法,统计树中具有度为1的结点数目。

解决问题的思路:
  1. int BiTree_height1(BiTree T)函数用于计算出树的高度(深度);
  2. void levelOrder( BiTree T);创建了一个记录每层树的宽度数组width[totalLevel]
  3. void printNodeAtLevel(BiTree T,int level,int *width,int static_level) ;参数:有宽度数组的指针,和静态的层数(因为level会因为函数递归而改变,所以建立这一个)函数主体记录每一层节点数
  4. void levelOrder2(const BiTree T);设立一个变量,统计单分支结点的个数
  5. 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);} 

例如:
在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/306816.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

future.cancel不能关闭线程_多线程与高并发笔记

1. 创建线程的四种方式实现Runnable 重写run方法继承Thread 重写run方法线程池创建 Executors.newCachedThreadPool()实现Callable接口2. Thread线程操作方法当前线程睡眠指定mills毫秒Thread.sleep([mills])当前线程优雅让出执行权Thread.yield()例如Thread t1, t2&#xff0c…

ANDROID手表怎么设置壁纸,表盘背景随心换 果壳智能手表换壁纸教程

在智能手机和电脑上&#xff0c;我们一般都会换一张自己喜欢的图片作为壁纸&#xff0c;当我们想把一张喜欢的图片做成果壳GEAK Watch表盘时&#xff0c;应该怎么做呢&#xff1f;其实只要简单的几个步骤&#xff0c;你就能获得独一无二的专属表盘。首先&#xff0c;打开一张你…

如何踢掉 sql 语句中的尾巴,我用 C# 苦思了五种办法

一&#xff1a;背景 1. 讲故事这几天都在修复bug真的太忙了&#xff0c;期间也遇到了一个挺有趣bug&#xff0c;和大家分享一下&#xff0c;这是一块sql挺复杂的报表相关业务&#xff0c;不知道哪一位大佬在错综复杂的 嵌套 平行 if判断中sql拼接在某些UI组合下出问题了&#…

数据结构——二叉树的最长路径问题

题目&#xff1a; 求任意二叉树中第一条最长的路径长度,并输出此路径上各结点的值。 描述 设二叉树中每个结点的元素均为一个字符&#xff0c;按先序遍历的顺序建立二叉链表&#xff0c;编写算法求出该二叉树中第一条最长的路径。 输入 一行数据&#xff0c;为二叉树的先序序…

.NET 应用如何优雅的做功能开关(Feature Flag)

点击上方蓝字关注“汪宇杰博客”导语曾经&#xff0c;我们要在应用程序里做功能开关&#xff0c;就避免不了在配置文件里加上一堆 bool 类型的配置项&#xff0c;然后在代码里用 if else 去判断。尽管这种做法是可行的&#xff0c;但我们现在有办法让代码更加整洁&#xff0c;避…

鼠标右键 移动选定的文件夹到指定位置_iRightMouse:一款免费Mac鼠标右键增强神器...

如果你是多年的Windows用户转到macOS平台&#xff0c;你必定会发现Windows上很多非常方便的鼠标右键菜单在macOS上都是没有的&#xff0c;例如新建txt文档、一键隐藏文件等。而这些快捷功能的缺失也确实会带来一些不便&#xff0c;奇客君发现一款刚刚上线的免费右键增强工具&am…

数据结构——从叶子结点到根节点的全部路径

问题 给定一个二叉树&#xff0c;返回所有从根节点到叶子节点的路径。 说明: 叶子节点是指没有子节点的节点。 示例: 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://leetcode-cn.com/problems/binary-tree-paths 257.二叉树的所有路径 与…

台电x80plus装linux,纤巧却不简单——台电X80 Plus评测

8英寸平板一直是各平板品牌混战厮杀的大战场。“性价比”是这个尺寸平板好坏的最重要关键字。今天就为大家带来台电8英寸X80 Plus平板电脑的评测。X80 Plus是台电8英寸产品中的最新款&#xff0c;采用的是英特尔新一代CherrTrail架构芯片Atom X5 Z8300。HD核显由原来的Gen7升级…

数据结构——二叉树的递归算法

二叉树的结构定义&#xff1a; typedef struct BiNode {TElemType data;struct BiNode *lchild;struct BiNode *rchild; }BiNode,*BiTree;这里包含的递归算法有&#xff1a; 二叉树的先序创建&#xff1b;二叉树的先序中序后序遍历&#xff1b;二叉树的销毁算法&#xff1b;双…

使用BeetleX访问redis服务

BeetleX针对redis访问封了全async/await操作模式&#xff0c;通过它可以更高效地访问redis服务。BeetleX.Redis提供读写分离和多机故意写入处理&#xff0c;同时安全的TLS访问机制&#xff0c;在使用功能上组件支持绝大部分基础指令&#xff0c;并提供json&#xff0c;protobuf…

鸿蒙系统可以替代安卓吗,华为今天发布的鸿蒙系统,到底能不能替代安卓?

对于大部分差友们来说&#xff0c;“开发者大会”这个词一定显得陌生而又遥远&#xff0c;跟普通的产品发布会不一样&#xff0c;他们面向的对象并不是普通的消费者&#xff0c;而是各种程序猿和攻城狮。话又说回来&#xff0c;能开“ 开发者大会”&#xff0c;也说明这个企业已…

android loading封装_我们经常用的Loading动画居然还有这种姿势

背景Loading动画几乎每个Android App中都有。一般在需要用户等待的场景&#xff0c;显示一个Loading动画可以让用户知道App正在加载数据&#xff0c;而不是程序卡死&#xff0c;从而给用户较好的使用体验。同样的道理&#xff0c;当加载的数据为空时显示一个数据为空的视图、在…

数据结构——基于字符串模式匹配算法的病毒感染检测

实验四 基于字符串模式匹配算法的病毒感染检测 【实验目的】 1.掌握字符串的顺序存储表示方法。 2.掌握字符串模式匹配BF算法和KMP算法的实现。 【实验内容】 问题描述 医学研究者最近发现了某些新病毒,通过对这些病毒的分析,得知它们的DNA序列都是环状的。现在研究者已收集了…

WPF 使用 Expression Design 画图导出及使用 Path 画图

WPF 使用 Expression Design 画图导出及使用 Path 画图目录WPF 使用 Expression Design 画图导出及使用 Path 画图一、软件介绍二、Microsoft Expression Design 使用三、微语言和 Path 绘图1、"注释" 图形&#xff08;中括号&#xff09;2、"并行模式" 图…

数据结构——模式匹配kmp算法

暴力算法 //暴力算法 int index(SString S,SString T,int pos) {int ipos,j1;while(i<S[0]&&j<T[0]){if(S[i]T[j]){i;j;}else {ii-j2;j1;}}if(j>T[0])return i-T[0];else return 0;} kmp算法 next[]数组的求法&#xff1a; 例子&#xff1a;abaabcac 模式串…

互联网时代供应链

供应链是指围绕核心企业&#xff0c;从配套零件开始&#xff0c;制成中间产品以及最终产品&#xff0c;最后由销售网络把产品送到消费者手中的、将供应商&#xff0c;制造商&#xff0c;分销商直到最终用户连成一个整体的功能网链结构。供应链管理的经营理念是从消费者的角度&a…

win7 计算器 android,教你巧妙应用Win7计算器和时钟

正文最新的Win7是一种个性化设计极强的操作系统&#xff0c;在许多细节方面都做到了人性化设计。其功能的DIY性非常明显&#xff0c;是XP系统远远不能比的。今天我们要说的是Win7计算器和时钟&#xff0c;除了可以计算和时间之外我们还可以让他们有哪些妙用呢&#xff1f;我们左…

真实经历:整整一年了,他是这样从程序员转型做产品经理的

这是头哥侃码的第224篇原创每年年底&#xff0c;有不少企业都会对一年内辛勤劳作的员工量身定做一些奖项。发个奖杯&#xff0c;给点奖金&#xff0c;让那些没得奖的人看看&#xff0c;咱们公司有多么的关注员工的闪光点&#xff0c;优秀之处。用人所长&#xff0c;容人所短&am…

数据结构—— 基于二叉树的算术表达式求值

实验五 基于二叉树的算术表达式求值 数据结构——中序表达式求值&#xff08;栈实现&#xff09; 实验目的&#xff1a; 1.掌握二叉树的二叉链表存储表示和二叉树的遍历等基本算法。 2.掌握根据中缀表达式创建表达式树的算法 3.掌握基于表达式树的表达式求值算法。 实验内容&a…

数字标牌 android,【浩鑫推出全球首款英特尔方案+Android系统数字标牌播放器】PjTime.COM 新品快讯 Intel...

世界知名迷你准系统领导品牌&#xff0d;浩鑫Shuttle&#xff0c;秉承开拓创新&#xff0c;引领行业发展的传统&#xff0c;此次创造性的推出全球首款采用英特尔硬件方案搭载Android系统的NS01A数字标牌播放器&#xff0c;为整个数字标牌行业贡献了全新的硬件解决方案。英特尔方…