`
jefferent
  • 浏览: 80334 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

树——树的转换

阅读更多

1. 树的存储结构

    通常,树的存储结构有三种,双亲表示法、孩子表示法和孩子兄弟表示法。

(1)双亲表示法

    双亲表示法是利用一组连续的存储单元存储树的每个结点,并利用一个指示器表示结点的双亲结点在树中的位置。

    树的双亲表示法存储表示描述如下:

   

#define MaxSize 200
typedef struct PNode        /* 双亲表示法的结点定义 */
{
    DataType data;
    int parent;                    /* 指示结点的双亲 */
}PNode;

typedef struct
{
    PNode node[MaxSize];
    int num;                        /* 结点的个数 */
}PTree;

 

图 树的双亲表示法

 

(2)孩子表示法

    由于树中每个结点可能有多个孩子,所以自然想到用多重链表存储树。在这种多重链表的每个结点中除了用于存放数据信息的data域外,还有若干指针域,分别用于指向该结点的孩子结点。但是一棵树中,不同结点的度数是不同的,那么每个结点中到底需要多少个指针域呢?我们有如下二种方案:

① 定长结点

    即树中每个结点均按树的度k来设置指针。n个结点的树一共有n*k个指针域,而树中只有n-1条边,故树中的空指针数目为kn-(n-1)=n(k-1)+1(k越大,浪费的空间越多)。

②不定长结点

    即树中每个结点按本结点的度来设置指针数,并在结点中增设一个度数域degree指出该结点包含的指针数。各结点不等长,虽然节省了空间,但是给运算带来不便。

    孩子结点表示法的类型定义如下:

//以下的DataType和MaxTreeSize由用户定义
    typedef struct CNode{//子链表结点
        int child; //孩子结点在向量中对应的序号
        struct CNode *next;
      }CNode;
    typedef struct{ 
        DataType data; //存放树中结点数据
        CNode *firstchild;//孩子链表的头指针
      }PTNode;
    typedef struct{
        PTNode nodes[MaxTreeSize];
        Int n,root; //n为结点总数,root指出根在向量中的位置
      }CTree;
    Ctree T; //T为孩子链表表示

 注意:当结点T.nodes[i]为叶子时,其孩子链表为空,即T.nodes[i].firstchild=NULL。

(3)孩子兄弟表示法

    孩子兄弟表示法,也成为树的二叉链表表示法。孩子兄弟表示法,采用链式存储结构,链表由一个数据域和两个指针域组成。其中,数据域存放结点的数据信息,一个指针域用来指示结点的第一个孩子结点,另一个指针域用来指示结点的下一个兄弟结点。

图 孩子兄弟表示法

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

/* 孩子兄弟表示法的类型定义 */
typedef struct CSNode
{
    DataType data;
    struct CSNode *firstchild, *nextsibling; /* 指向第一个孩子和下一个结点 */
}CSNode, *CSTree;

 

2. 树、森林的遍历

(1)树的遍历

    设树T如下图所示,结点R是根,根的子树从左到右依次为T1,T2,…,Tk

(1)树T的前序遍历定义: 
  若树T非空,则:
 ①访问根结点R;
  ②依次前序遍历根R的各子树T1,T2,…,Tk

(2)树的后序遍历定义:
  若树T非空,则:
    ①依次后序遍历根T的各子树Tl,T2,…,Tk
    ②访问根结点R。

【例】对下面的(a)图中的树进行前序遍历和后序遍历,得到的前序序列和后序序列分别是ABCDE和BDCEA。

图 树和对应的二叉树

注意
     ① 前序遍历一棵树恰好等价于前序遍历该树对应的二叉树
     ② 后序遍历树恰好等价于中序遍历该树对应的二叉树。

(2)森林的遍历

(1)前序遍历森林
    若森林非空,则:
①访问森林中第一棵树的根结点;
②前序遍历第一棵树中根结点的各子树所构成的森林
③前序遍历除第一棵树外其它树构成的森林。

(2)后序遍历森林
  若森林非空,则:
①后序遍历森林中第一棵树的根结点的各子树所构成的森林;
②访问第一棵树的根结点;
③后序遍历除第一棵树外其它树构成的森林。
  注意:
 ① 前序遍历森林等同于前序遍历该森林对应的二叉树
 ② 后序遍历森林等同于中序遍历该森林对应的二叉树
【例】对下面(a)图中所示的森林进行前序遍历和后序遍历,则得到该森林的前序序列和后序序列分别为ABCDEFICJH和BDCAIFJGHE。而(b)图所示二叉树的前序序列和中序序列也分别为ABCDEFICJH和BDCAIFJGHE。

图 森林和对应的二叉树

  ③ 当用二叉链表作树和森林的存储结构时,树和森林的前序遍历和后遍历,可用二叉树的前序遍历和中序遍历算法来实现。

 

3. 树、森林和二叉树的转换

    树或森林与二叉树之间有一个自然的一一对应关系。任何一个森林或一棵树可惟一地对应到一棵二叉树;反之,任何一棵二叉树也能惟一地对应到一个森林或一棵树。

(1)树、森林到二叉树的转换

* 将树转换为二叉树
     树中每个结点最多只有一个最左边的孩子(长子)和一个右邻的兄弟。按照这种关系很自然地就能将树转换成相应的二叉树:
  ①在所有兄弟结点之间加一连线;
  ②对每个结点,除了保留与其长子的连线外,去掉该结点与其它孩子的连线。
【例】下面(a)图所示的树可转换为(c)图所示的二叉树。

图 树转化为二叉树

注意:由于树根没有兄弟,故树转化为二叉树后,二叉树的根结点的右子树必为空。
* 将一个森林转换为二叉树
 具体方法是:
  ① 将森林中的每棵树变为二叉树
  ② 因为转换所得的二叉树的根结点的右子树均为空,故可将各二叉树的根结点视为兄弟从左至右连在一起,就形成了一棵二叉树。
【例】下图中,左边包含三棵树的森林可转换为右边的二叉树。

图 森林转化为二叉树

(2)二叉树到树、森林的转换
    把二叉树转换到树和森林自然的方式是:若结点x是双亲y的左孩子,则把x的右孩子,右孩子的右孩子,…,都与y用连线连起来,最后去掉所有双亲到右孩子的连线。
【例】下图的森林就是由二叉树转换成的。 

图 森林转化为二叉树

分享到:
评论

相关推荐

    coder-L#LeetCodeRecord#538——把二叉搜索树转换为累加树1

    示例:输入: 原始二叉搜索树:输出: 转换为累加树:思路:反中序遍历,先遍历右子树,然后根节点,然后左子树,保存求和的结果,依次赋值即可代码:Definitio

    微软面试题——二元查找树转变成排序的双向链表

    二元查找树转变成排序...输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。 要求不能创建任何新的结点,只调整指针的指向。 10 / \ 6 14 / \ / \ 4 8 12 16 转换成双向链表 4=6=8=10=12=14=16。

    c语言数据结构课设——树的应用2.docx

    要求:实现树与二叉树的转换·以及树的前序﹑后序的递归﹑非递归算法,层次序的非递归算法的实现,应包含建树的实现。 要求:实现树与二叉树的转换·以及树的前序、后序的递归、非递归算法,层次序的非递归算法的实现,...

    数据结构模拟演示过程swf——树系列(整理出来的,很直观,非常不错!)

    包括: B树的删除.swf B树的生长过程.swf ...树、森林和二叉树的转换.swf 寻找中序线索化二叉树指定结点的后继.swf 寻找中序线索化二叉树指定结点的前驱.swf 中序线索化二叉树.swf 希望对朋友们有帮助

    第五章 树与二叉树

    (1)加线——树中所有相邻的兄弟结点之间加一条线; (2)去线——对树中的每个节点,只保留它与第一个孩子结点之间的连线,删去它与其他孩子结点之间的连线。 (3)层次调节——以根结点为轴心,将树顺时针转动...

    C++思维导图Xmind文件和.png文件(持续更新)

    C++思维导图Xmind文件和.png文件: 构造函数与析构函数思维导图Xmind文件和.png文件 拷贝构造思维导图xmind文件和.png文件 运算符重载思维导图xmind文件和.png文件 初始化列表、匿名对象、static成员、...C++——红黑树

    C#全能速查宝典

    1.1.2 as操作符——引用类型转换 3 1.1.3 base关键字——从派生类中访问基类的成员 3 1.1.4 变量——存储特定类型的数据 4 1.1.5 Console类——控制台中的输入流、输出流和错误流 6 1.1.6 Convert类——类型转换 8 ...

    design-pattern-java.pdf

    树形结构的处理——组合模式(二) 树形结构的处理——组合模式(三) 树形结构的处理——组合模式(四) 树形结构的处理——组合模式(五) 装饰模式-Decorator Pattern 扩展系统功能——装饰模式(一) 扩展系统...

    论文研究-从网页目录到轻量级本体——自然语言处理及形式化.pdf

    为了解决以自然语言表示节点标签的...从而使整个分类树转换成了一个轻量级本体,它适合应用在数据整合的语义匹配、文档分类和语义搜索等方面的自动推理,从而促进了本体知识的自动化推理,为以后文本自动检索奠定基础。

    Java设计模式 版本2

    对象的克隆——原型模式,复杂对象的组装与创建——建造者模式,不兼容结构的协调——适配器模式,处理多维度变化——桥接模式,树形结构的处理——组合模式,扩展系统功能——装饰模式,深入浅出外观模式,实现对象...

    C++数据结构实验三:树的应用

    也可以是以学校管理层次体系或者族谱为蓝本,将表示该实际问题的树结构转换为对应的二叉树后,再以二叉树的创建方法来创建这棵具有实际意义的树结构。) 2、对构建的二叉树分别采用先序、中序、后序遍历算法输出每个...

    ApkIDE——安卓反编译

    3、代码编码器增加将选中的文字从“Unicode转换为AscII”或“从AscII 转换为Unicode”二个转换命令,转换结果将直接替换编辑器选中的文本。 4、修复部份系统环境下签名出现“java’ 不是内部或外部命令”的错误。 ...

    2-Windows中的DNS服务——正向解析&反向解析配置.docx

    Windows中的DNS服务——正向解析&反向解析配置 • windows server 2008 /dns服务器 /域名 /网络 坚信并为之坚持是一切希望的原因。 -----------------------------------------------------------------------------...

    数据挖掘——实用机器学习工具与技术

    本书主要内容包括:数据输入/输出、知识表示、数据挖掘技术(决策树、关联规则、基于实例的学习、线性模型、聚类、多实例学习等)以及在实践中的运用。本版对上一版内容进行了全面更新,以反映自第2版出版以来数据...

    大数据整理——数据集成.pdf

    ⼤数据整理 ⼤数据整理——数据集成 数据集成 数据集成 数据集成 1.背景: 背景: 因业务需要,事业单位内部普遍构建了多个异构的信息系统,这些信息系统中管理的数据源彼此独⽴、相互封闭,形成"信息孤岛"⽆法形成 ...

    详解Vue快速零配置的打包工具——parcel

    Parcel 将 资源 树转换成 包(bundles) 树。许多其它的打包工具基本上是基于 JavaScript 资源,还有附加在其上的其它格式的资源。例如,在 JS 文件中内联成字符串。 Parcel是对文件类型无感知的,它能按你所期待的...

    论文研究-一种自适应的多粒度概念提取方法——高斯云变换.pdf

    在此基础上,创新地提出用云模型中数字特征构建概念含混度作为概念外延共识程度的衡量,设计并实现了高斯云变换算法,将问题域中的数据分布自动转换为多粒度的不同概念,构建出人类概念认知中的泛概念树。...

    华南 数据结构上机实验代码 完整代码

    栈的应用——进制转换 括号匹配检验 行编辑程序 表达式求值 队列的应用——银行客户平均等待时间 计算next值 KMP算法 二叉树的构建及遍历操作 实现二叉排序树的各种算法(1) 实现二叉排序树的各种算法(2) ...

Global site tag (gtag.js) - Google Analytics