热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【树】树、森林和二叉树的关系

树的存储结构1.双亲表示法这种方法用一组连续的空间来存储树中的结点,在保存每个结点的同时附设一个指示器来指示其双亲结点在表中的位置,其结点的结构如下图所示:双亲表示法的形式说明如下
树的存储结构
1.双亲表示法
  • 这种方法用一组连续的空间来存储树中的结点,在保存每个结点的同时附设一个指示器来指示其双亲结点在表中的位置,其结点的结构如下图所示:

《【树】树、森林和二叉树的关系》

双亲表示法的形式说明如下:

#define MAX 100
typedef struct TNode
{
DataType data;
int parent;
} TNode;

树可以定义为:

typedef struct
{
TNode tree[MAX];
int nodenum; /*结点数*/
} ParentTree;

《【树】树、森林和二叉树的关系》《【树】树、森林和二叉树的关系》

2.孩子表示法
  • 这种方法通常是把每个结点的孩子结点排列起来,构成一个单链表,称为孩子链表。n 个结点共有 n 个孩子链表(叶子结点的孩子链表为空表),而 n 个结点的数据和 n 个孩子链表的头指针又组成一个顺序表。

《【树】树、森林和二叉树的关系》

孩子表示法的存储结构定义如下:

typedef struct ChildNode /* 孩子链表结点的定义 */
{
int Child; /* 该孩子结点在线性表中的位置 */
struct ChildNode *next; /*指向下一个孩子结点的指针 */
} ChildNode;
typedef struct /* 顺序表结点的结构定义 */
{
DataType data; /* 结点的信息 */
ChildNode *FirstChild; /* 指向孩子链表的头指针 */
} DataNode;
typedef struct /* 树的定义 */
{
DataNode nodes[MAX]; /* 顺序表 */
int root; /* 该树的根结点在线性表中的位置 */
int num; /* 该树的结点个数 */
} ChildTree;

3.孩子兄弟表示法(最重要)
  • 这种表示法又称为树的二叉表示法,或者二叉链表表示法,即以二叉链表作为树的存储结构。链表中每个结点设有两个链域,分别指向该结点的第一个孩子结点和下一个兄弟(右兄弟)结点。

《【树】树、森林和二叉树的关系》

孩子兄弟表示法的类型定义如下:

typedef struct CSNode
{
DataType data; /*结点信息*/
Struct CSNode *FirstChild; /*第一个孩子*/
Struct CSNode *Nextsibling; /*下一个兄弟*/
} CSNode, *CSTree;

这种存储结构便于实现树的各种操作,例如,如果要访问结点 x 的第 i 个孩子,则只要先从FirstChild 域找到第一个孩子结点,然后沿着这个孩子结点的 Nextsibling 域连续走 i-1 步,便可找到 x的第 i 个孩子。如果在这种结构中为每个结点增设一个 Parent 域,则同样可以方便地实现查找双亲的操作。

树、森林与二叉树的相互转换

前面介绍了树的存储结构和二叉树的存储结构,从中可以看到,树的孩子兄弟链表结构与二叉树的二叉链表结构在物理结构上是完全相同的,只是它们的逻辑含义不同,所以树和森林与二叉树之间必然有着密切的关系。本节介绍树和森林与二叉树之间的相互转换方法。

1.树转换为二叉树

《【树】树、森林和二叉树的关系》《【树】树、森林和二叉树的关系》
《【树】树、森林和二叉树的关系》

2.森林转换为二叉树
  • 森林是若干棵树的集合。树可以转换为二叉树,森林同样也可以转换为二叉树。因此,森林也可以方便地用孩子兄弟链表表示。

《【树】树、森林和二叉树的关系》

3.二叉树还原为树或森林

《【树】树、森林和二叉树的关系》

树与森林的遍历
1.树的遍历

《【树】树、森林和二叉树的关系》
《【树】树、森林和二叉树的关系》
方法一:

void RootFirst(CSTree root)
{
if (root != NULL)
{
Visit(root->data); /* 访问根结点 */
p = root->FirstChild;
while (p != NULL)
{
RootFirst(p); /* 访问以 p 为根的子树 */
p = p->Nextsibling;
}
}
}

方法二:

void RootFirst(CSTree root)
{
if (root != NULL)
{
Visit(root->data); /*访问根结点*/
RootFirst(root->FirstChild); /*先根遍历首子树*/
RootFirst(root->Nextsibling); /*先根遍历兄弟树*/
}
}

2.森林的遍历

《【树】树、森林和二叉树的关系》

《【树】树、森林和二叉树的关系》
《【树】树、森林和二叉树的关系》
例如,右图中森林的后序遍历序列为 DCBFJIHGEA。
《【树】树、森林和二叉树的关系》

对照二叉树与森林之间的转换关系可以发现,森林的先序遍历、中序遍历和后序遍历与其相应二叉树的先序遍历、中序遍历和后序遍历是对应相同的,因此可以用相应二叉树的遍历结果来验证森林的遍历结果。另外,树可以看成只有一棵树的森林,所以树的先根遍历和后根遍历分别与森林的先序遍历和中序遍历对应。森林的遍历算法可以采用其对应的二叉树的遍历算法来实现。


推荐阅读
  • 【剑指offer】11.二叉树的深度
    总目录:算法之旅导航目录 1.问题描述输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度,根节点的深度视 ... [详细]
  • OpenCV入门(八)--形态学图像处理
    膨胀膨胀是指将一些图像(或图像中的一些区域,A)与核(B)进行卷积。核可以是任何的形状或大小,它拥有一个单独定义出来的参考点。膨胀举例:腐蚀腐蚀是 ... [详细]
  • 数据结构学习记录(六)树
    前言树:有且只有一个称为根的节点,有若干个互不相交的子树,这些子树本身也是一颗树。通俗理解:树由节点与边组成, ... [详细]
  • *题意:往区间[1,10000000]的墙上贴海报,海报数量 ... [详细]
  • Mybatis一级缓存的锅
    问题背景项目开发中有一个树形数据结构,不像经典组织结构树、菜单级别树,我们这个树形结构是用户后期手动建立起来的关系。因此数据库表结构为两张表:数据记录表、记录关系表,通过业务规则限 ... [详细]
  • P3521[POI2011]ROTTreeRotations题目大意:给一棵$(1≤n≤200000)$个叶子的二叉树,可以交换每个点的左右子树,要求前序遍历叶子的逆序对最少。我们 ... [详细]
  • poj 2421 Constructing Roads 解题报告
    题目链接:http:poj.orgproblem?id2421实际上又是考最小生成树的内容,也是用到kruskal算法。但稍稍有点不同的是, ... [详细]
  • MySQL的内存结构与物理结构
    从MySQL的物理结构和内存结构开始了解整个MySQL的运行机制,其中有几个特别重要的概念,也是平时工作中更加关注的地方,如:binlog、redolog、表空间、慢查询日志、My ... [详细]
  • 前面介绍过一种非顺序数据结构是散列表,本文将详细介绍另一种非顺序数据结构——树,它对于存储需要快速查找的数据非常有用二叉树、满二叉树、完全二叉树、堆、 ... [详细]
  • 参考博文:https:www.cnblogs.comjoeblackzqqarchive201207102584121.html1、获取从1970年到现在的秒数(时间戳)time_ ... [详细]
  • 编程实现QQ表情文件CFC格式
    编程实现QQ表情文件CFC格式背景:最近闲来无事,也应论坛某会员要求,想做个QQ表情下载的站点。本来事情是很简单的,写个小小 ... [详细]
  • 标准库Vector类型使用需要的头文件:#includeVector:Vector是一个类模板。不是一种数据类型。Vector ... [详细]
  • typedef是一种有趣的声明形式:它为一种类型引入新的名字,而不是为变量分配空间。在某些方面,typedef类似于宏文本替换——它并没有 ... [详细]
  • 在做linux下面的网络编程时写了如下一段程序[cpp:showcolumns]viewplaincopy102030405060708090100110120130140150& ... [详细]
  • 取得当前时间戳importtimeprinttime.time()格式化时间戳为标准格式printtime.strftime(%Y.%m.%d,time.localtime ... [详细]
author-avatar
成就未来7368
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有