最新要闻
- 当前速递!父亲借女儿3万压岁钱不还被起诉 法院:应还本金及利息
- 焦点观察:1万元!佳能入门级全画幅相机EOS R8规格曝光
- 世界微速讯:为S23让路!三星Galaxy S22京东秒杀:骁龙8小屏旗舰 3569元
- 环球微头条丨豆瓣8.1分!《三体》主创:能拍中国科幻大作 此生无憾
- 热资讯!重庆一景区煮麻辣汤圆:下次元宵佳节还得等384天
- 男子打包螺蛳粉开车24小时运回北京 只因朋友圈一句话:这是真爱
- 【天天新视野】用户滑雪频繁触发iPhone车祸检测功能 苹果:已进行了优化 同时派代表考察
- 天天快播:甜品级游戏本价格已曝光:搭载RTX 4050/4060
- 女子春节连打4通宵麻将:患上突发性耳聋
- 国产显卡搞定“显卡杀手”:摩尔线程MTT S80居然能跑《孤岛危机》
- 【世界独家】极限挤牙膏!三星Galaxy S23系列用残血版LPDDR5X内存
- 【全球热闻】游客洪崖洞花30元找当地大爷抄近道 只花2分钟:网友道出真相
- 速讯:博纳影业总裁妻子金巧巧否认暗指《满江红》排片多、不好看:个人喜好
- 颜值最高的白色手机来了!vivo X90告白下周预售:天玑9200加持
- 零下10度静止一夜不掉电!“车主”盛赞恒驰5 OTA效果好
- 大众也不香了!比亚迪ATTO 3获德媒超高认可:钟爱刀片电池
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
[数据结构] 树、森林的遍历
树的遍历
树的遍历方式有先根遍历和后根遍历。在下面树的遍历中,采用的都是孩子兄弟表示法构建的树。
树的先根遍历
树的先根遍历步骤
先根遍历就是先访问树的根节点,然后再依次访问树的孩子们。在这里我们需要用递归函数来实现树的先根遍历,先打印当前节点的数据,然后再递归访问其第一个孩子,再递归访问当前节点的兄弟。注意树的根节点是没有兄弟的,在第一层递归中实际只会递归访问其 firstchild,这一点在创建树的过程中也需注意。递归函数停止递归的边界条件很简单,遇到空指针 NULL停止即可。
假设函数名为 CStree_preorder,则大致步骤如下:(1)print(root->data)(2)CStree_preorder(root->firstchild)(3)CStree_preorder(root->nextsibling)
【资料图】
树的先根遍历图解
(1)
(2)
(3)
(4)
(5)
(6)
(7)
(8)
树的先根遍历小技巧
树的先根遍历可以看成是以根节点为起点,围绕整个树跑一圈,所经历的节点值的序列就是树的先根遍历的结果(重复出现过的节点值不再加入到序列中)。这一点和二叉树的前序遍历很像。
树的先根遍历代码
void CSTree_Show_Pre_Order(CSTree T){ if(T == NULL) return; printf("%c ", T->data); CSTree_Show_Pre_Order(T->firstchild); CSTree_Show_Pre_Order(T->nextsibling);}
树的后根遍历
树的后根遍历步骤
后根遍历的顺序是先访问根节点的孩子们,然后访问根节点。我们还是用递归函数来解决,先递归访问当前节点的第一个孩子,然后打印当前节点的数据,最后再递归访问当前节点的兄弟。递归函数停止递归的边界条件很简单,遇到空指针 NULL停止即可。
假设函数名为 CStree_postorder,则大致步骤如下:(1)CStree_postorder(root->firstchild)(2)print(root->data)(3)CStree_postorder(root->nextsibling)
树的后根遍历图解
(1)
(2)
(3)
(4)
(5)
(6)
(7)
树的后根遍历小技巧
树的后根遍历可以看成是剪葡萄一样,将节点依次剪下后得到的序列就是树的后根遍历的结果,这一点和二叉树的后序遍历有点相似。
树的后根遍历代码
void CSTree_Show_Post_Order(CSTree T){ if(T == NULL) return; CSTree_Show_Post_Order(T->firstchild); printf("%c ", T->data); CSTree_Show_Post_Order(T->nextsibling);}
树的遍历与二叉树的遍历
树的先根遍历与二叉树的前序遍历
由于我们使用的是孩子兄弟表示法构建的树,实际上我们将树以二叉链式的结构存储了起来,其本质上已经转换为一棵二叉树。树的 firstchild对应了二叉树的 leftchild,树的 nextsibling对应了二叉树的 rightchild。
结合上文先根遍历的代码和其对应关系,我们可以发现其递归操作的顺序和二叉树的前序遍历是一样的。所以我们其实可以先将树转换为二叉树,然后进行前序遍历,得到的遍历结果和树的先根遍历是一样的。
树的后根遍历与二叉树的中序遍历
同理,结合上文后根遍历的代码和其对应关系,我们可以发现其递归操作的顺序和二叉树的中序遍历是一样的。所以我们其实可以先将树转换为二叉树,然后进行中序遍历,得到的遍历结果和树的后根遍历一样。
森林的遍历
森林的先序遍历
森林的先序遍历步骤
森林的先序遍历顺序即按照森林的每棵树的顺序,对每一棵树进行先根遍历。
森林的先序遍历代码
//森林的先序遍历void Forest_Show_Pre_Order(Forest F){ for(int i = 0; i < F->n; i++) CSTree_Show_Pre_Order(F->ct[i]);}
森林的中序遍历
森林的中序遍历步骤
森林的先序遍历顺序即按照森林的每棵树的顺序,对每一棵树进行后根遍历。
森林的中序遍历代码
//森林的中序遍历void Forest_Show_Post_Order(Forest F){ for(int i = 0; i < F->n; i++) CSTree_Show_Post_Order(F->ct[i]);}
森林的遍历与二叉树的遍历
森林的先序遍历与二叉树的前序遍历
森林在转换为二叉树的过程中,将每个树根节点用 rightchild进行了连接。转换成二叉树递归遍历完根节点的左子树时,接下来递归遍历其右子树,而此右子树也是森林中第二个树的根节点,以此类推,可以得出转换成二叉树的前序遍历正好就是森林先序遍历的结果。
森林的先序遍历
转换为二叉树的前序遍历
森林的中序遍历与二叉树的中序遍历
同理,森林转换为二叉树的中序遍历,正好对应了森林中序遍历的结果。
森林的中序遍历
转换为二叉树的中序遍历
程序测试
程序代码
#include#include#define MAX 100typedef char Elemtype;//树 (孩子兄弟表示法)typedef struct CSNode{ Elemtype data; struct CSNode *firstchild; //第一个孩子 struct CSNode *nextsibling; //下一个兄弟}CSNode, *CSTree;//二叉树 结构体typedef struct BiNode{ Elemtype data; struct BiNode *leftchild; //左儿子 struct BiNode *rightchild; //右儿子}BiNode, *BinaryTree; //森林 结构体typedef struct { CSTree ct[MAX]; int n; //树的个数}forest, *Forest;/*—————————————————————————————————————————————————————————————————————————————————————*///创建 树CSTree Create_CSTree(){ Elemtype data; CSTree T; scanf("%c", &data); //输入节点数据 getchar(); if(data == "#") //输入 - 以停止创建子树 return NULL; T = (CSTree)malloc(sizeof(CSNode)); T->data = data; printf("输入 %c 的第一个孩子数据(#停止): ", data); //递归创建 T->firstchild = Create_CSTree(); printf("输入 %c 的下一个兄弟数据(#停止): ", data); T->nextsibling = Create_CSTree(); return T;}/*—————————————————————————————————————————————————————————————————————————————————————*///树 转化为 二叉树BinaryTree CSTree_Transform_to_BinaryTree(CSTree ct){ if(!ct) return NULL; BinaryTree T = (BinaryTree)malloc(sizeof(BiNode)); T->data = ct->data; //相当于将left变为firstchild, 将right变为nextsibling 本质的形态没有改变 T->leftchild = CSTree_Transform_to_BinaryTree(ct->firstchild); T->rightchild = CSTree_Transform_to_BinaryTree(ct->nextsibling); return T;}//二叉树 转化 为树CSTree BinaryTree_Transform_to_CSTree(BinaryTree bt){ if(!bt)return NULL; CSTree T = (CSTree)malloc(sizeof(CSNode)); T->data = bt->data; //相当于将firstchild变为left, 将nextsibling变为right 本质的形态没有改变 T->firstchild = BinaryTree_Transform_to_CSTree(bt->leftchild); T->nextsibling = BinaryTree_Transform_to_CSTree(bt->rightchild); return T;}//森林 转化为 二叉树BinaryTree Forest_Transform_to_BinaryTree(CSTree ct[], int low, int high){ if(low > high)return NULL; //每个树变成二叉树 BinaryTree T = CSTree_Transform_to_BinaryTree(ct[low]); //通过rightchild连接每一个二叉树的根节点 T->rightchild = Forest_Transform_to_BinaryTree(ct, low + 1, high); return T;}//二叉树 转化为 森林Forest BinaryTree_Transform_to_Forest(BinaryTree bt){ Forest F = (Forest)malloc(sizeof(forest)); BinaryTree p = bt; BinaryTree q = NULL; int count = 0; while(p){q = p->rightchild; //q指向要切断连接的下一个节点(即其右儿子)p->rightchild = NULL; //切断连接 形成单独的树F->ct[count++] = BinaryTree_Transform_to_CSTree(p);//二叉树 转化为 树存到森林中p = q; //p指向下一个节点 重复操作 } F->n = count; //记录森林中 树的个数 return F;}/*—————————————————————————————————————————————————————————————————————————————————————*///前序 递归遍历二叉树void BinaryTree_Show_Pre_Order(BinaryTree T){ if(T == NULL)return; printf("%c ", T->data); BinaryTree_Show_Pre_Order(T->leftchild); BinaryTree_Show_Pre_Order(T->rightchild);}//中序 递归遍历二叉树void BinaryTree_Show_Infix_Order(BinaryTree T){ if(T == NULL) return; BinaryTree_Show_Infix_Order(T->leftchild); printf("%c ", T->data); BinaryTree_Show_Infix_Order(T->rightchild);}//后序 递归遍历二叉树void BinaryTree_Show_Post_Order(BinaryTree T){ if(T == NULL)return; BinaryTree_Show_Post_Order(T->leftchild); BinaryTree_Show_Post_Order(T->rightchild); printf("%c ", T->data);}/*—————————————————————————————————————————————————————————————————————————————————————*///树的先根遍历 (相当于将firstchild当做left, 将nextsibling当做right)void CSTree_Show_Pre_Order(CSTree T){ if(T == NULL)return; printf("%c ", T->data); CSTree_Show_Pre_Order(T->firstchild); CSTree_Show_Pre_Order(T->nextsibling);}//树的后根遍历 写法和二叉树的中序遍历一样(相当于将firstchild当做left, 将nextsibling当做right)void CSTree_Show_Post_Order(CSTree T){ if(T == NULL)return; CSTree_Show_Post_Order(T->firstchild); printf("%c ", T->data); CSTree_Show_Post_Order(T->nextsibling);}/*—————————————————————————————————————————————————————————————————————————————————————*///森林的先序遍历void Forest_Show_Pre_Order(Forest F){ for(int i = 0; i < F->n; i++)CSTree_Show_Pre_Order(F->ct[i]);}//森林的中序遍历void Forest_Show_Post_Order(Forest F){ for(int i = 0; i < F->n; i++)CSTree_Show_Post_Order(F->ct[i]);}/*—————————————————————————————————————————————————————————————————————————————————————*/int main(){ CSTree F[3]; for(int i = 0; i < 3; i++){ printf("创建第 %d 棵树 输入根节点(注意根节点无兄弟):\n", i + 1); F[i] = Create_CSTree(); printf("\n"); } printf("第一棵普通树后根遍历: \n"); CSTree_Show_Post_Order(F[0]); printf("\n"); printf("第二棵普通树先根遍历: \n"); CSTree_Show_Pre_Order(F[1]); printf("\n"); printf("三棵树组成的森林转化为二叉树之后中序遍历: \n"); //如果是一个Forset结构体指针F Foresr_Transform_to_BinaryTree(F->ct, 0, (F->n) - 1) BinaryTree bt = Forest_Transform_to_BinaryTree(F, 0, 2); BinaryTree_Show_Infix_Order(bt); printf("\n"); printf("二叉树再次转换为森林之后先根遍历: \n"); Forest backF = BinaryTree_Transform_to_Forest(bt); Forest_Show_Pre_Order(backF); printf("\n");}
程序运行结果
关键词: 递归函数
-
每日时讯!MAUI新生2.5-数据绑定和MVVM:MVVM的属性验证
一、MVVM的属性验证案例Toolkit Mvvm框架中的ObservableValidator类,提供了属性验证功能,可以使用我...
来源: [数据结构] 树、森林的遍历
每日时讯!MAUI新生2.5-数据绑定和MVVM:MVVM的属性验证
当前速递!父亲借女儿3万压岁钱不还被起诉 法院:应还本金及利息
焦点观察:1万元!佳能入门级全画幅相机EOS R8规格曝光
世界微速讯:为S23让路!三星Galaxy S22京东秒杀:骁龙8小屏旗舰 3569元
环球微头条丨豆瓣8.1分!《三体》主创:能拍中国科幻大作 此生无憾
低代码平台前端的设计与实现(三)设计态画布DesignCanvas的设计与实现
热资讯!重庆一景区煮麻辣汤圆:下次元宵佳节还得等384天
男子打包螺蛳粉开车24小时运回北京 只因朋友圈一句话:这是真爱
【天天新视野】用户滑雪频繁触发iPhone车祸检测功能 苹果:已进行了优化 同时派代表考察
天天快播:甜品级游戏本价格已曝光:搭载RTX 4050/4060
环球消息!5 组合数据类型
今日讯!短记我的二十五岁,如落叶般随风飘荡。
世界观焦点:java基础:流程控制
女子春节连打4通宵麻将:患上突发性耳聋
国产显卡搞定“显卡杀手”:摩尔线程MTT S80居然能跑《孤岛危机》
【世界独家】极限挤牙膏!三星Galaxy S23系列用残血版LPDDR5X内存
世界微动态丨wireshark 抓包整理———— 从一个小案例开始 [一]
【全球热闻】游客洪崖洞花30元找当地大爷抄近道 只花2分钟:网友道出真相
速讯:博纳影业总裁妻子金巧巧否认暗指《满江红》排片多、不好看:个人喜好
颜值最高的白色手机来了!vivo X90告白下周预售:天玑9200加持
天天消息!Python教程:IO
零下10度静止一夜不掉电!“车主”盛赞恒驰5 OTA效果好
当前视点!java基础:java基础语法
大众也不香了!比亚迪ATTO 3获德媒超高认可:钟爱刀片电池
快资讯:CPU性能提升10%!13代酷睿笔记本测试数据出炉
【全球报资讯】盖茨向马斯克“泼冷水”:殖民火星完全浪费钱
世界新资讯:医生发现19岁阿尔兹海默症患者:已知最年轻
SQL SERVER——高可用技术概述
环球微头条丨用ChatGPT写作业?新算法给AI生成文本加水印:置信度高达99.999999999994%
快播:【Redis场景拓展】秒杀问题-全局唯一ID生成策略
美团一面:InndoDB 单表最多 2000W,为什么?小伙伴竟然面挂
每日精选:2个月没人管!AMD老显卡终于要有新驱动了
奢侈品不愁卖!LV将涨价20% 世界首富放言:中国人有钱
全球看热讯:Andlua+实现WakeUpOnline远程开机
Docker搭建本地私有仓库
世界即时:vue/ts 新建项目时好用的配置 【vite.config.ts、tsconfig.json、】
天天热点!大爷看《狂飙》入戏屏幕前举杯痛饮 被演技折服:口碑大剧结尾你满意吗?
厉害!中国半导体领域科研论文数量持续全球第一 光触媒等已超美国
【缓存策略及实践】前端如何配置 HTTP 缓存机制
全球简讯:为什么感觉工资过万很普遍了?打打字就能月入过万你心动吗?央视揭秘新骗局
《生化危机4:重制版》第五章演示:里昂和碍事梨合作通关
云南小女孩骑鸵鸟上学从容淡定 挡眼睛控制方向:网友调侃是大象年检了
观焦点:造车新势力轿车月榜Top2 长安深蓝SL03迎开门红:1月交付6137台
环球快消息!越野车开进古河床随意碾压:改装牧马人无视警示牌“撒野” 专家:保护有难度
天天微资讯!2899元价格屠夫!XiaoMI Book 12.4 二合一评测:办公追剧不在话下
微头条丨C盘扩容:不要轻易转换动态磁盘 Dynamic Disk
乳腺癌已成为全球第一大癌症:我国每年新增42万 比国外发病早
今日观点!投资不过山海关对东北伤害狠!老工业基地全力发展新能源车 专家称沈阳可成深圳
世界今热点:全球首位!以色列总统使用ChatGPT写演讲稿:开头、结尾感受下
全球看热讯:《角斗士2》明年上映
全球热点评!阿里云盘致歉:昨晚系统故障 全平台无法加载内容
TGA年度最佳!《双人成行》销量破1000万:双人游戏天花板
环球今日报丨特斯拉降价到20万出头 网友忍不住要下单 宝马奔驰大众:我们不跟
速递!腾讯视频官宣:《三体》番外剧《三体:大史》即将上线
2023年1月随笔
世界今日报丨大跃进了!今年小米新机都将抛弃USB 2.0
今日立春:二十四节气之首 万物开始复苏
8个你可能不知道答案的常见JavaScript面试问题
世界热资讯!荣耀北斗卫星通信专利获批通过 荣耀Magic5系列将首发?
B站《三体》动画“晚节不保”:即将跌破4分
全球实时:再也不怕手一抖跳广告了!规范App乱跳转新标准出台
热门:坚挺四年的苹果:栽了
关注:你以为你真的会玩《俄罗斯方块》?看完这些大神 我大悟了
UI通过元素定位实现特定区域截图
全球热推荐:2022浙江高考数学导数压轴解析
每日速讯:春节开特斯拉出行的国内车主真不少!自驾万里的数以百计
微头条丨开年如何选购生产力整机!锐龙9 7950X vs i9-13900K对比测试:谁是更好的创作工具?
【全球聚看点】客人泡茶放近50根藏红花吓坏主人 真大补药:喝完身体并没有不适
四川公司回应招聘“下班到点跑的绕道”:本职工作完成不用加班
世界今亮点!MySQL数据类型补充
当前资讯!Python中的关键字的用法
每日热闻!在 FreeBSD 12 上安装 Gitea
女子身高185求职当老师被拒 用人单位:常弯腰工作很累
环球焦点!599元 戴尔上架新款透明机械键盘:定制轴体 全键热插拔
AMD Zen4笔记本登顶世界第一!31%优势碾压12代酷睿
环球最资讯丨ES6 简介(一)
【环球热闻】一汽车电梯故障 200多万的法拉利秒变“大事故车”
NVIDIA AD106、AD107小核心首次现身:“减肥”多达30%
全球今亮点!《狂飙》能“逆风翻盘” 一半功劳都是热搜的
全球微速讯:宠托师职业受青睐!上门喂宠物 几天收入数千元
环球微速讯:不用羡慕代驾小哥了!绿源新品TCR开售:整车超轻能跑120km
100%纯果蔬汁:味全每日C果汁5.5元/瓶抄底
私家车定速巡航失灵!时速120狂飙半小时:万幸平安无事
全球快报:《三体》主演于和伟:我本身就是科幻迷!
环球快看点丨1月新能源汽车销量榜:比亚迪“能打”两个特斯拉
全球快讯:iPhone 14 Plus出货跌到0台:苹果拒绝认输
一文搞懂工作流审批(Java+activiti)快速开发+自定义工作流
天天热推荐:HEU_KMS_Activator_v27.0.2全能系统数字许可激活工具
快看:2999元 联想扬天V14/V15笔记本上架:Zen2架构锐龙5 7520U
国产科幻FPS大作!《边境》官宣2月6日开启新测试
环球焦点!网友花2499元就买到了努比亚Z50:系统零广告 性价比无敌
每日热门:AMD终于要解决锐龙7000装机贵的麻烦了 B650主板降价
每日速递:《三体》电视剧惊现360全家桶产品:竟遭周鸿祎挑刺
天天热讯:大神教你显卡和CPU怎么搭配才合适
Python借助企业微信群机器人推送消息和文件
【天天聚看点】【验证码逆向专栏】某验“初代”滑块验证码逆向分析
快资讯丨阿里二面: BigKey、HotKey 问题严重,该如何 预防和解决
Pandas练习
2023年安卓机皇!聊聊三星S23系列与前代有哪些不同