【数据结构】树与森林(树的存储结构、森林与二叉树的转化、树与森林的遍历)

目录

  • 树和森林
    • 树的存储结构
      • 一、树的双亲表示法:
      • 二、树的孩子表示法
        • 方法一:定长结点的多重链表
        • 方法二:不定长结点的多重链表
        • 方法三:孩子单链表表示法
      • 三、树的二叉链表(孩子-兄弟)存储表示法
    • 森林与二叉树的转换
    • 树和森林的遍历
      • 先根(次序)遍历
      • 后根(次序)遍历(待补充)
      • 按层次遍历(待补充)

  1. 树与二叉树知识点文章: 【数据结构】树与二叉树(递归法先序、中序、后序、层次遍历二叉树、二叉树的建立以及求树高的方法)
  2. 二叉树遍历算法的应用: 【数据结构】树与二叉树遍历算法的应用(求叶子节点个数、求树高、复制二叉树、创建二叉树、二叉树存放表达式、交换二叉树每个结点的左右孩子)

树和森林

树的非顺序存储映像:

  1. 双亲表示法
  2. 孩子表示法
  3. 树的二叉链表(孩子-兄弟)存储表示法

树的存储结构

一、树的双亲表示法:

祖先(双亲)
定义:用一维数组存放树中的每一结点的值(data)和双亲位置(parent,逻辑关系)

特点:找祖先易,找子孙难
典型用例:并查集
在这里插入图片描述

//树的双亲表示法
#define MAX_TREE_SIZE 100
typedef struct PTNode {int data;int parent;  // 双亲位置
} PTNode;typedef struct {PTNode nodes[MAX_TREE_SIZE];int  r,n;//r为根节点的位置,n为树中结点的个数
} PTree;

说明:结点存放无顺序要求,根结点不一定存在第一个位置;每个数组元素对应树中一个结点,存放结点的值和双亲位置r—根结点位置,n—树中结点个数。

二、树的孩子表示法

树的孩子表示法:存放树中每个结点的信息、直接后继的地址。

根据结点直接后继的存放方式,分为:

  1. 定长结点的多重链表:每个结点按照树的度设置孩子指针的数量
  2. 不定长结点的多重链表:每个结点按照结点自身的度设置孩子指针的数量
  3. 孩子单链表:每个结点的孩子结点(直接后继)建一个单链表
方法一:定长结点的多重链表

树的孩子表示法:定长结点的多重链表
(典型:实现树的层次遍历)

定义:链表存放树中的每一结点的值(data)和孩子结点位置(child[i],第i个孩子指针,表示逻辑关系),每个结点的孩子指针的个数=树中孩子最多的结点的孩子个数=树的度.
在这里插入图片描述

1. 特点:结点的结构统一,若树的度为d,则点包含一个数据域,d个孩子指针域.

2. 缺点:空指针多,浪费空间

方法二:不定长结点的多重链表

树的孩子表示法–不定长结点的多重链表

定义:链表存放树中的每一结点的值(data)和孩子结点位置(child[i],逻辑关系),每个结点的孩子指针的个数=该结点的孩子个数=结点的度
在这里插入图片描述

树的度为d,该树的不定长结点的多重链表中结点结构有几种?
树的度为d=3,该树的不定长结点的多重链表中结点结构有4种
总结:树的度为d,该树的不定长结点的多重链表中结点结构有d+1种.
在这里插入图片描述

特点:结点的结构不统一,包含一个数据域,结点的度d, d个孩子指针域
缺点:操作较复杂

方法三:孩子单链表表示法

将每个结点的孩子结点拉成一个单链表
情况一:
结点C在孩子表示法中存了2次
一次出现在下标为2的数组元素中,该数组元素同时保存了C的孩子单链表的头指针。
一次出现在结点A的孩子单链表中。
数据元素存放多次更新操作比较麻烦,更新一个数据元素,所有保存该数据元素的地方均要更新,否则信息不一致

在这里插入图片描述

情况二:
节省存储空间方便更新操作和数据维护,每个数据元素只在数组中存放一次;
在孩子单链表中只存放这个孩子在数组中的位置
如下图所示:
结点A的孩子单链表中第一个孩子结点是下标为1的数组元素(B),第二个孩子是下标为2的数组元素(C),第三个孩子是下标为3的数组元素(D)。
在这里插入图片描述

若既要找子孙,又要找祖先,可将孩子单链表和双亲表示法结合在一起每个数组元素的data域存放数据元素的值,pa域存放双亲结点在数组中的位置,firstchild存其孩子单链表的头指针。

typedef struct CTNode{ int child;struct CTNode *next;} *ChildPtr;//数组元素类型:
typedef struct{ ElemType  data; ChildPtr firstchild;
//孩子单链表的头指针
} CTBox;//树:
typedef struct{CTBox nodes[MAX_TREE_SIZE]; int  n,r;
// 树的结点数和根结点的位置
} CTree;

三、树的二叉链表(孩子-兄弟)存储表示法

[fc,data,nb]
在这里插入图片描述

typedef structCSNode{ElemType data;structCSNode*fc, *nb;
}CSNode, *CSTree;

树中每个结点三部分:
数据域(data),长子指针域(fc),
右邻兄弟指针域(nb)

树和二叉树的转换
• 树以孩子兄弟表示法存,相当于将树转换成二叉树,但此二叉树根结点无右子树
• 好处:借助二叉树的操作实现树的操作

森林与二叉树的转换

⮚ 树采用二叉链表(孩子-兄弟)存储表示法,转换成二叉树
⮚ 森林由多棵树组成: F = ( T 1 , T 2 , … , T n ) F = ( T1, T2, …, Tn ) F=(T1,T2,,Tn); 将其每棵树转换成二叉树 B T 1 , B T 2 , … , B T n BT₁, BT₂, …, BTn BT1,BT2,,BTn;
⮚ 每棵二叉树BT的根的右子树皆为空树,从BTn开始依次将其根结点链为前一棵二叉树的根的右孩子
⮚ 将森林转换成一棵二叉树,森林的操作可借助二叉树的操作完成

森林和二叉树的转换
• 森林以孩子兄弟表示法存,相当于将森林转换成二叉树
• 好处:借助二叉树的操作实现森林的操作

树和森林的遍历

■ 树的遍历可有三条搜索路径:
⮚ 先根(次序)遍历:若树不空,则先访问根结点,然后依次先根遍历各棵子树。
⮚ 后根(次序)遍历:若树不空,则先依次后根遍历各棵子树,然后访问根结点。
⮚ 按层次遍历:若树不空,则自上而下自左至右访问树中每个结点。
在这里插入图片描述

[fc,data,nb]

typedef structCSNode{int data;structCSNode*fc, *nb;
}CSNode, *CSTree;

树中每个结点三部分:数据域(data),长子指针域(fc),右邻兄弟指针域(nb)

先根(次序)遍历

对应二叉树的先序

//树的孩子兄弟表示法
typedef structCSNode{ElemType data;structCSNode*fc, *nb;
}CSNode, *CSTree;//二叉树的二叉链表表示法
typedef struct BiTNode {ElemType  data;struct BiTNode *lchild, *rchild;
} BiTNode, *BiTree;void PreorderTraverse(CSTree T){SeqStack s ;	s.top=-1; p = T;while(p){while(p){printf(%c”,p->data);if(p->nb)if(s.top==MAX-1) exit (0);else s.data[++s.top]=p->nb;p =p->fc;}if (s.top!=-1) p=s.data[s.top--];}
}

后根(次序)遍历(待补充)

对应二叉树的中序

按层次遍历(待补充)

叶子结点
判断是否为子孩子 fc是否为空
p->fc == NULL

森林由三部分构成:
1.森林中第一棵树的根结点;
2.森林中第一棵树的子树森林;
3.森林中其它树构成的森林。

  1. 后根(次序)遍历与对应的二叉树的中序遍历相同
  2. 先根(次序)遍历与对应的二叉树的先序遍历相同
  3. 森林的先序遍历—对应二叉树的先序遍历
  4. 森林的中序遍历—对应二叉树的中序遍历

感谢阅读!!!

  1. 树与二叉树知识点文章: 【数据结构】树与二叉树(递归法先序、中序、后序、层次遍历二叉树、二叉树的建立以及求树高的方法)
  2. 二叉树遍历算法的应用: 【数据结构】树与二叉树遍历算法的应用(求叶子节点个数、求树高、复制二叉树、创建二叉树、二叉树存放表达式、交换二叉树每个结点的左右孩子)

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

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

相关文章

QT使用单例模式创建全局引用类

单例模式介绍 单例模式是一种设计模式,用于确保类只能创建一个实例,并提供一种全局访问该实例的方式。在单例模式中,类的构造函数被私有化,这样就不能通过常规方式创建对象实例。相反,类提供一个静态方法或静态变量来获取其唯一的实例。 单例模式通常用于管理全局状态或…

设计一个健壮的漏洞检测模块需要考虑多个方面

设计一个健壮的漏洞检测模块需要考虑多个方面,包括漏洞数据库、扫描策略、结果解析和报告生成等。以下是一个简化的设计概述和一些模拟数据及测试示例。 漏洞检测模块设计 漏洞数据库: 包含一个已知的漏洞列表,每个漏洞都有唯一的标识符、描…

MPP-媒体软件V5.0开发参考

0. 写在前面 本篇博文用于记录工作项目中遇到的ss928板端视频获取相关内容。、 1. API参考 系统控制实现MPP(Media Process Platform)系统初始化、系统绑定解绑、获取MPP版本号、视频缓存池初始化、创建视频缓存池等功能。 ●ss_mpi_sys_set_cfg:配置系统控制参数。 ●ss_mp…

uni-app实现分页--(1)准备工作,首页下拉触底加载更多

实现流程如下: 分析:需要在滚动容器中添加滚动触底,在猜你喜欢中获取数据。难点:如何在父页面调用子组件内的方法。父组件中用ref,并定义组件实例类型,子组件中暴露方法 具体代码如下: 1.在父组件中添加…

sqlplus / as sysdba下中文乱码问题

export NLS_LANGamerican_america.AL32UTF8 export LANGen_US.UTF-8 set NLS_LANGamerican_america.AL32UTF8 set LANGen_US.UTF-8 select userenv(language) from dual;可以查出数据库的字符集 select * from nls_database_parameters where parameter LIKE %CHARACTERSET%…

计算机专业考研考哪些专业课

https://zhuanlan.zhihu.com/p/182416996 计算机专业考研的专业课通常包括以下几个主要科目,但具体的考试科目和内容可能会根据不同的学校和专业方向有所差异: 数据结构: 这是计算机科学的基础课程之一,涉及算法和数据结构的设计、…

计算机视觉——基于深度学习UNet实现的复杂背景文档二值化算法实现与模型训练

1. 引言 阈值分割可以被视为一个分类问题,通常涉及两个类别,这也是为什么阈值分割也被称为二值化。对于文档图像,我们期望阈值算法能够正确地将墨水分类为黑色,将纸张分类为白色,从而得到二值化图像。对于数字灰度图像…

OpenCV | 基于视频的基础操作

目录 一. OpenCV 关于视频的基础操作1. cv.VideoCapture ( ) 读取摄像头 / 视频文件2. cv.VideoCapture ( ).set ( ) 设置视频属性3. cv.VideoCapture ( ).get ( ) 打印视频属性4. cv.VideoCapture ( ).read ( ) 读帧5. capture.release ( ) 释放资源6. cv.VideoWriter ( ) 视频…

ruoyi-nbcio-plus基于vue3的flowable的自定义业务撤回申请组件的升级修改

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码: https://gitee.com/nbacheng/ruoyi-nbcio 演示地址:RuoYi-Nbcio后台管理系统 http://122.227.135.243:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a…

《前端面试题》- JS基础 - 简单谈谈ES6新增了哪些内容

问题 简单谈谈ES6新增了哪些内容 回答 ES新增的对象有: Symbol、Set、Map、WeakSet和WeakMap、ArrayBuffer、TypedArray、DataView、Promise、GeneratorFunction 和 Generator、Reflect、Proxy 具体可参考:https://www.jianshu.com/p/b54f7ad1cae3ht…

想做产品经理,应该选择什么专业?

产品经理作为互联网公司的核心职位,一直以来备受关注。随着互联网的不断发展,产品经理的需求也越来越高,很多人都想要了解哪些专业适合做产品经理。本文将为大家介绍几个适合做产品经理的专业。 1、心理学相关专业 C端产品工作的本源&#x…

【产品】ANET智能通信管理机 物联网网关 电力监控/能耗监测/能源管理系统

产品概述 本系列智能通信管理机是一款采用嵌入式硬件计算机平台,具有多个下行通信接口及一个或者多个上行网络接口,用于将一个目标区域内所有的智能监控/保护装置的通信数据整理汇总后,实时上传主站系统,完成遥信、遥测等能源数据…

在 Mac 上配置高级内容缓存设置

在 Mac 上配置高级内容缓存设置 您可以使用高级配置参数针对网络配置微调内容缓存。 您可以在“终端”中使用命令行或通过修改“/资源库/Preferences/com.apple.AssetCache.plist”文件中的键值,来设定内容缓存的高级配置参数。若要使某些更改生效,必须…

如何更改 CSS 背景图片的不透明度

介绍 opacity 是一个 CSS 属性,允许你改变元素的不透明度。默认情况下,所有元素的值为 1。通过将这个值更接近 0,元素将会变得越来越透明。 一个常见的用例是将图像作为背景的一部分。调整不透明度可以提高文本的可读性或实现所需的外观。然…

【实战解析】YOLOv9全流程训练至优化终极指南

【实战解析】YOLOv9全流程训练至优化终极指南 0.引言1.环境准备2.数据预处理(1)数据准备(2)按比例划分数据集(3)xml转txt脚本(4)配置文件 3.模型训练(1)单GPU…

打开游戏缺少dll文件怎么办,dll文件一键修复方法

在我们日常操作电脑,经常会遇到各种各样的问题。比如想玩一会游戏的时候,电脑屏幕上却赫然弹出一则令人颇为扫兴的提示:“打开游戏缺少dll文件”。这个问题可能会让我们感到困惑和沮丧,但是幸运的是,有很多方法可以帮助…

iOS cocoapods pod FrozenError and RuntimeError

0x00 报错日志 /Library/Ruby/Gems/2.6.0/gems/cocoapods-1.12.0/lib/cocoapods/user_interface/error_report.rb:34:in force_encoding: cant modify frozen String (FrozenError)from /Library/Ruby/Gems/2.6.0/gems/cocoapods-1.12.0/lib/cocoapods/user_interface/error_r…

电压继电器SRMUVS-220VAC-2H2D 导轨安装 JOSEF约瑟

系列型号: SRMUVS-58VAC-2H欠电压监视继电器;SRMUVS-100VAC-2H欠电压监视继电器; SRMUVS-110VAC-2H欠电压监视继电器;SRMUVS-220VAC-2H欠电压监视继电器; SRMUVS-58VAC-2H2D欠电压监视继电器;SRMUVS-100…

数据仓库与数据挖掘(第三版)陈文伟思维导图1-5章作业

第一章 概述 8.基于数据仓库的决策支持系统与传统决策支持系统有哪些区别? 决策支持系统经历了4个阶段。 1.基本决策支持系统 是在运筹学单模型辅助决策的基础上发展起来的,以模型库系统为核心,以多模型和数据库的组合形成方案辅助决策。 它…

EasyExcel写数据

本地文件写数据 package com.qiangesoft.easyexcel.write;import com.alibaba.excel.EasyExcel; import com.alibaba.excel.ExcelWriter; import com.alibaba.excel.enums.CellDataTypeEnum; import com.alibaba.excel.metadata.data.*; import com.alibaba.excel.util.FileUt…