树与森林的存储、遍历和树与森林的转换

树的存储结构

双亲表示法

孩子表示法:

(a)多重链表(链表中每个指针指向一棵子树的根结点);

(b)把每个跟结点的孩子结点排列起来,看成一个线性表,且以单链表做存储结构.且N个头指针也组成一个线性表.

孩子兄弟表示法://二叉树表示法或二叉链表表示法

以二叉链表做树的存储结构,链表中结点的两个链域分别指向该结点的第一个孩子结点和下一个兄弟结点(fchild 和nsibling)

//孩子兄弟表示法
typedef struct CSNode{
    int data;
    CSNode *fchild ,*nsibling;
} CSNode, *CSTree;

二叉树和树都可用二叉链表作存储结构,则以二叉链表作为媒介可导出树与二叉树之间的一一对应关系。

森林和二叉树的转换

由树的二叉链表表示定义知道:任何一棵和树对应的二叉树的右子树必空。若将森林中第二棵树的根结点看成第一棵树的根结点的兄弟,如此重复……则可以导出森林和二叉树的对应关系。

树和二叉树的转换

使用孩子兄弟表示法来转换,土办法:可以把有同一个双亲结点的各个孩子结点有虚线串起来,把每层的每个结点分支从左到右除去第一个外,其余都剪掉,则剩余的图(包括虚线)就是二叉树。详细过程如下:

树和森林的遍历

只有两种,森林得失先序和中序,树的是先跟和后跟

树的遍历

先根遍历:(二叉树的先序遍历)

先访问根结点,

然后依次先根遍历根的每棵子树。

先根遍历序列,对应二叉树先序遍历

后根遍历:(二叉树的中序遍历)

后根访问根的每棵子树,

然后访问根结点。

后根遍历序列,对应二叉树的中序遍历

森林的遍历:

先序

1.访问森林中第一棵树的根结点;

2.先序遍历第一棵树中根结点的子树森林;

3.先序遍历除去第一棵树之后剩余的树构成的森林.

先序遍历序列

中序

1.中序遍历第一棵树中根结点的子树森林;

2.访问森林中第一棵树的根结点;

3.中序遍历除去第一棵树之后剩余的树构成的森林.

中序遍历序列

时间: 2024-10-29 00:19:29

树与森林的存储、遍历和树与森林的转换的相关文章

数据结构 - 树和森林表示与遍历

双亲表示法(顺序存储结构) 用一组连续的存储空间来存储树的结点,同时在每个结点中附加一个指示器(整数域) ,用以指示双亲结点的位置(下标值) .数组元素及数组的类型定义如下: #define MAX_SIZE 100 typedef struct PTNode { ElemType data ; int parent ; }PTNode ; typedef struct { PTNode Nodes[MAX_SIZE] ; int root; /* 根结点位置 */ int num ; /* 结

树的存储、森林的存储

树的存储: 二叉树的存储: 1.  连续存储(顺序存储)[完全二叉树],以数组实现 优点: 查找某个节点的父节点和子节点(包括判断有没有子节点和父节点) 缺点: 耗用内存空间过大 2.  链式存储: 一个节点包含三个部分:左子节点地址.数据域.右子节点地址 优点:耗内存小 一般树的存储: 由于计算机的内存是线性的,而树是非线性的.若在计算机里只存树的有效节点,便不能查找某个节点的子节点和父节点(或者说整个树的逻辑存储无法知晓),所以必须要先转化成完全二叉树,把垃圾节点补上. 绿色的是普通树,蓝色

javascript实现数据结构: 树和二叉树,二叉树的遍历和基本操作

树型结构是一类非常重要的非线性结构.直观地,树型结构是以分支关系定义的层次结构. 树在计算机领域中也有着广泛的应用,例如在编译程序中,用树来表示源程序的语法结构:在数据库系统中,可用树来组织信息:在分析算法的行为时,可用树来描述其执行过程等等. 下面讲解的内容完整代码在这:https://github.com/LukeLin/data-structure-with-js/blob/master/Binary%20tree/BinaryTree.js 首先看看树的一些概念: 1.树(Tree)是n

树的基本概念和遍历规则

树的递归定义 树是n(n>0)个结点的有限集,这个集合满足以下条件: ⑴有且仅有一个结点没有前驱(父亲结点),该结点称为树的根: ⑵除根外,其余的每个结点都有且仅有一个前驱: ⑶除根外,每一个结点都通过唯一的路径连到根上(否则有环).这条路径由根开始,而未端就在该结点上,且除根以外,路径上的每一个结点都是前一个结点的后继(儿子结点): 由上述定义可知,树结构没有封闭的回路. 节点的分类 结点一般分成三类 ⑴根结点:没有父亲的结点.在树中有且仅有一个根结点.如节点r ⑵分支结点:除根结点外,有孩子

【树4】二叉树的遍历

简介 遍历二叉树就是按照某种顺序,将树中的结点都枚举一遍,且每个结点仅仅访问一次.因为树不是线性的结构,遍历不像线性表那样简单,因此他的遍历需要特点的算法来完成. 从某种角度讲,对二叉树的遍历就是将树形结构转换为线性结构的操作. 二叉树的遍历方法主要有如下几种: 先序遍历:先访问root结点,再先序遍历左子树,再先序遍历右子树. 中序遍历:先中序遍历左子树,再访问root结点,再中序遍历右子树. 后序遍历:先后序遍历左子树,再后序遍历右子树,再访问root结点. 层遍历:从上到下,从左到右,一层

数据结构--树(定义与存储结构)

树基本定义 树的定义 数是具有n个节点的有限集.如图即是一个树形结构. 节点分类 节点的度:一个节点拥有的子节点即成为节点的度,比如A节点,有B和C两个子节点,那么A节点的度=2. 叶节点(终端节点):没有子节点的节点,比如G.H.I.... 如图: 节点间关系 孩子节点:某一个节点的子节点称为孩子节点.比如B.C节点是A节点的孩子节点. 双亲节点:与孩子节点相反.比如,A节点是B.C的双亲节点. 兄弟节点:同一个双亲节点的孩子节点,之间称为兄弟节点.比如,B.C为兄弟节点. 如图: 树的存储结

为什么用B+树做索引&MySQL存储引擎简介

索引的数据结构 为什么不是二叉树,红黑树什么的呢? 首先,一般来说,索引本身也很大,不可能全部存在内存中,因此索引往往以索引文件的方式存在磁盘上.然后一般一个结点一个磁盘块,也就是读一个结点要进行一次IO操作. 而二叉树啊这些树类的数据结构,查找时间主要和树的高度有关,所以虽然一颗AVL树或者是红黑树在查找上比起顺序遍历的O(N)有了比较大的改善,但B树和B+树因为每个结点存的元素更多,所以查询更快,对磁盘的IO操作也更少. 为什么是B+树而不是B树呢? 1. 单一节点存储更多的元素(这样该节点

根据 中序遍历 和 后序遍历构造树(Presentation)(C++)

好不容易又到周五了,周末终于可以休息休息了.写这一篇随笔只是心血来潮,下午问了一位朋友PAT考的如何,顺便看一下他考的试题,里面有最后一道题,是关于给出中序遍历和后序遍历然后求一个层次遍历.等等,我找一下链接出来...... 1127. ZigZagging on a Tree (30):https://www.patest.cn/contests/pat-a-practise/1127 突然想起以前学数据结构的时候如果给出一个中序遍历和一个后序遍历然后让你画出树的结构或求出先序遍历之类的题目,

树的深度优先与广度优先遍历

简述树的深度优先及广度优先遍历算法,并说明非递归实现. 原题出自百度的笔试: 当时我看到这个题目的时候,已经完全记不得非递归算法该怎么实现了,后来查阅了一下,要用到两个辅助的数据结构: 深度优先遍历--->栈: 广度优先遍历--->队列: 这里以二叉树为例来实现. import java.util.ArrayDeque; public class BinaryTree { static class TreeNode{ int value; TreeNode left; TreeNode rig