数据结构(五)——树森林

5.4 树和森林

5.4.1 树的存储结构

树的存储1:双亲表示法
用数组顺序存储各结点,每个结点中保存数据元素、指向双亲结点(父结点)的“指针”

#define MAX_TREE_SIZE 100// 树的结点
typedef struct{ElemType data;int parent;
}PTNode;// 树的类型
typedef struct{PTNode nodes[MAX_TREE_SIZE];int n;	//结点数量
}PTree;


优点:找双亲(父结点)很方便
缺点:找孩子不方便,只能从头到尾遍历整个数组

树的存储2:孩子表示法(顺序+链式存储)

#define MAX_TREE_SIZE 100struct CTNode{int child;	//孩子结点在数组中的位置struct CTNode *next;	//下一个孩子
}typedef struct{ElemType data;struct CTNode *firstChild;	//第一个孩子
}CTBox;typedef struct{CTBox node[MAX_TREE_SIZE];int n,r;	//结点数和根的位置
}CTree;

优点:找孩子很方便
缺点:找双亲(父结点)不方便,只能遍历每个链表

树的存储3:孩子兄弟表示法
树的孩子兄弟表示法与二叉树类似,采用二叉链表实现,每个结点内保存数据元素和两个指针,但两个指针的含义和二叉树结点不同

//孩子兄弟表示法结点
typedef struct CSNode{ElemType data;struct CSNode *firstchild, *nextsibling;	//第一个孩子和右兄弟结点
}CSNode, *CSTree;

 

5.4.2 树、森林与二叉树的转换

树到二叉树的转换
①先在二叉树中,画一个根节点。
②按“树的层序”依次处理每个结点。
处理一个结点的方法是:如果当前处理的结点在树中有孩子,就把所有孩子结点 “用右指针串成糖葫芦”,并在二叉树中把第一个孩子挂在当前结点的左指针下方

森林到二叉树的转换
①先把所有树的根结点画出来,在二叉树中用右指针串成糖葫芦。
②按“森林的层序”依次处理每个结点。
处理一个结点的方法是:如果当前处理的结点在树中有孩子,就把所有孩子结点“用右 指针串成糖葫芦”,并在二叉树中把第一个孩子挂在当前结点的左指针下方

注意:森林中各棵树的根节点视为平级的兄弟关系

二叉树到树的转换
①先画出树的根节点
②从树的根节点开始,按“树的层序”恢复每个结点的孩子
如何恢复一个结点的孩子:在二叉树中,如果当前处理的结点有左孩子,就把左孩 子和“一整串右指针糖葫芦” 拆下来,按顺序挂在当前结点的下方


二叉树到森林的转换
①先把二叉树的根节点和“一整串右指针糖葫芦”拆下来,作为多棵树的根节点
②按“森林的层序”恢复每个结点的孩子
如何恢复一个结点的孩子:在二叉树中,如果当前处理的结点有左孩子,就把左孩子和“一整串右指针糖葫 芦” 拆下来,按顺序挂在当前结点的下方


5.4.3 树和森林的遍历

树的先根遍历。若树非空,先访问根结点, 再依次对每棵子树进行先根遍历。(深度优先遍历)

void PreOrder(TreeNode *R){if(R!=NULL){visit(R);while(R还有下一个子树T)PreOrder(T);}
}

树的先根遍历序列与这棵树相应二叉树的先序序列相同

树的后根遍历。若树非空,先依次对每棵子树进行后根遍历,最后再访问根结点。(深度优先遍历)

树的后根遍历序列与这棵树相应二叉树的中序序列相同。

树的层次遍历(用队列实现):(广度优先遍历)
   ①若树非空,则根节点入队
   ②若队列非空,队头元素出队并访问,同时将该元素的孩子依次入队
   ③重复②直到队列为空

森林的先序遍历
森林。森林是m (m>0)棵互不相交的树的集合。每棵树去掉根节点后,其各个子树又组成森林。

若森林为非空,则按如下规则进行遍历:

  1. 访问森林中第一棵树的根结点。
  2. 先序遍历第一棵树中根结点的子树森林。
  3. 先序遍历除去第一棵树之后剩余的树构成的森林。

效果等同于依次对各个树进行先根遍历,等同于对二叉树的先序遍历。

森林的中序遍历

  1. 中序遍历森林中第一棵树的根结点的子树森林。
  2. 访问第一棵树的根结点。
  3. 中序遍历除去第一棵树之后剩余的树构成的森林

效果等同于依次对各个树进行后根遍历,等同于对二叉树的中序遍历。

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

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

相关文章

sqlplus格式设置

一、语法 1.当前连接生效 设置sqlplus模式显示总行数: SQL> show pagesize; --查看目前的pagesizeSQL> set pagesize 100; --设置pagesize为100设置sqlplus模式显示行宽度: SQL> show linesize; --查看当前的linesize宽度SQL> set linesize 100; --设…

MySQL全面瓦解备份与恢复

1 为什么需要数据库备份 灾难恢复:当发生数据灾难的时候,需要对损坏的数据进行恢复和还原需求的变更或者回滚:当需求发生变更,或者需要回滚到之前的版本时,数据库备份也显得很重要。审计:需要知道某一个阶段的数据或者Schema的实际情况测试:将实际的生产环境的数据导入到…

【无人机综合题】+题解

在没有遮挡的山地、水面、沙漠,那个对遥控的距离影响最大??(水面,因为飞机在一大片水体上飞行会产生下沉效应坐飞机限制携带的电池容量是多少?坐飞机限制携带的电池容量是160Wh.多旋翼机由几个部分组成?分】多旋翼机由机架、电调、电机、电池&#x…

webpack为什么要使用loader,如何手写loader

webpack是一个打包工具,即webpack会将一切文件视为模块,但是webpack在打包的时候只是认识JS文件或者JSON文件,并不认识CSS文件,png图片等,如果想让webpack能够在打包的时候识别其他文件,就必须要使用loader…

【Godot4.2】像素直线画法及点求取函数

概述 基于CanvasItem提供的绘图函数进行线段绘制只需要直接调用draw_line函数就可以了。 但是对于可以保存和赋值节点直接使用的纹理图片,却需要依靠Image类。而Image类没有直接提供基于像素的绘图函数。只能依靠set_pixel或set_pixelv进行逐个像素的填色。 所以…

C++项目——集群聊天服务器项目(三)muduo网络库

今天来介绍集群聊天器项目中网络模块代码的核心模块——muduo网络库,一起来看看吧~ 环境搭建C项目——集群聊天服务器项目(一)项目介绍、环境搭建、Boost库安装、Muduo库安装、Linux与vscode配置-CSDN博客 Json第三方库C项目——集群聊天服务器项目(二)Json第三方库…

Nodejs版本管理工具nvm

官网地址 https://github.com/coreybutler/nvm-windows/releases 下载1.1.12版本,使用图形化安装。 参考这篇文章: https://blog.csdn.net/m0_46491549/article/details/129750694 一步到位——Node版本管理神器nvm安装教程(2024最新&#x…

Linux的介绍以及其发展历史

文章目录 前言一、技术是推动社会发展的基本动力1.人为什么能成为万物之长呢?2.人为什么要发明工具,进行进化呢?3.人是如何发明工具的?4.为什么要有不同的岗位和行业? 二、计算机(操作系统)发展的基本脉络1.第一台计算…

Xilinx高级调试方法--多卡调试

Xilinx高级调试方法--多卡调试 1 测试工程2 驱动修改3 工程测试 本文主要介绍基于XVC技术实现多卡调试的方法 1 测试工程 加速卡1 Verdor ID:1BD4Device ID:903E 加速卡2 Verdor ID:1BD4Device ID:903F 2 驱动修改 为了同时识…

智能小程序开发 —— P2P SDK 源码介绍(二)

ty.p2p.uploadFile P2P上传文件 需引入P2PKit,且在>0.0.1版本才可使用 参数 Object object 属性类型默认值必填说明deviceIdstring是设备idalbumNamestring是albumName 和设备端约定字段filePathstring是文件本地路径extDatastring否扩展字段extDataLengthnum…

基于PyTorch深度学习实战入门系列-PyTorch基础全

Torch的基本使用 判断GPU是否可用 torch.cuda.is_available()张量 Torch 定义了 10 种张量类型,包括 CPU 和 GPU 形式,如下表所示: 数据类型dtypeCPU张量GPU张量32位浮点数torch.float32、torch.floattorch.FloatTensortorch.cuda.FloatTenso…

大数据技术原理与应用 01.大数据概述

不可以垂头丧气,会显矮 —— 24.3.24 参考学习:厦门大学 林子雨老师 大数据技术原理与应用 一、大数据时代 大数据概念、影响、应用、关键技术 大数据与云计算、物联网的关系 ①三次信息化浪潮时代 ②第三次信息化浪潮的技术支撑 1>存储设备容量不断…

ARM:按键中断

key_inc.c #include"key_inc.h"void key1_it_config(){//使能GPIOF外设时钟RCC->MP_AHB4ENSETR | (0x1<<5);//将PF9设置为输入模式GPIOF->MODER & (~(0x3<<18));//设置由PF9管脚产生EXTI9事件EXTI->EXTICR3 & (~(0XFF<<8));EXTI…

msyq类型类转换造成索引失效

今天碰到一个慢sql的问题&#xff0c;sql明明按照最前缀的原则写的&#xff0c;但是索引就是不生效&#xff0c;最终排查发现是因为索引字段发生类型转换造成的。 一、表结构 1、表字段 2、表索引 二、问题sql EXPLAIN SELECT * FROM t_res WHERE open 1 AND res_date &…

蓝桥杯day12刷题日记

P8720 [蓝桥杯 2020 省 B2] 平面切分 思路&#xff1a;首先借用dalao的图解释一下&#xff0c;又多出一条与当前平面任意一条直线都不重合线时&#xff0c;多了的平面是交点数1&#xff0c;所以用双层循环每次往里面加一条直线&#xff0c;计算交点 #include <iostream>…

Ubuntu Desktop - Updates (不升级到新版本)

Ubuntu Desktop - Updates [不升级到新版本] 1. UpdatesReferences 1. Updates System Settings -> Software & Updates -> Updates ubuntu-16.04.3-desktop-amd64.iso 不升级到新版本 ​ References [1] Yongqiang Cheng, https://yongqiang.blog.csdn.net/

TypeScript 常见的面试题

文章目录 1. 什么是TypeScript2. 类型声明和类型推断的区别&#xff0c;并举例应用3. 什么是接口&#xff08;interface&#xff09;&#xff0c;它的作用&#xff0c;接口的使用场景。接口和类型别名&#xff08;Type Alias&#xff09;的区别4. 什么是泛型&#xff08;generi…

RK3588开发笔记-v1.3.0-SDK文件系统分区添加

目录 目录 前言 一、分区文件 二、分区文件初始化 三、板级配置文件修改

【Linux】nmcli命令详解

目录 ​编辑 一、概述 二、常用参数使用 2.1 nmcli networking 1.显示NM是否接管网络 2.查看网络连接状态 3.开/关网络连接 2.2 general ​编辑 1.显示系统网络状态 2.显示主机名 3.更改主机名 2.3 nmcli connection ​编辑1.显示所有网络连接 2.显示某个网卡的…

JAVA 100道题(15)

15.使用TreeSet对一组整数进行排序。 在Java中&#xff0c;TreeSet是一个基于红黑树实现的NavigableSet接口。由于它是自动排序的&#xff0c;因此当我们向TreeSet中添加元素时&#xff0c;它们会自动按照自然顺序&#xff08;对于整数&#xff0c;就是从小到大的顺序&#xf…