数据结构---树、二叉树、森林

1、基本术语:

度:有两种度“结点的度”与“树的度”。结点的度指的是一个结点子树的个数;树的度是指树中结点度的最大值。

叶子结点:指的是没有子树的结点

层:树是有层次的,一般根结点为第0层。规定根结点到某结点的路径长度为该结点的层数。

深度:树中结点的最大层数

兄弟:同一双亲的结点,互为兄弟

堂兄弟:双亲在同一层次的结点,互为堂兄弟

祖先:从根结点到该结点的路径上的所有结点都是该结点的祖先。

子孙:以某一结点为根的子树上的所有结点都是该结点的子孙

森林:n棵互不相交的树

2、二叉树:

不同于树,结点的度<=2,而且子树有左右之分,如下图:

编号规则为从左到右、从上到下,如下图:

性质1:位于第i层的结点个数不大于2的i次方。

性质2:二叉树的深度为n,二叉树总的结点个数不大于2的n+1次方减去1。

性质3:叶子节点个数 = 度为2的结点个数 + 1

满二叉树:除了最底层的结点外,其余结点的度均为2,如下图

完全二叉树:不一定满,若一个二叉树有n个结点,他与满二叉树编号为1-n的结点一一对应。这样的二叉树称为完全二叉树

性质1:编号为i的结点的双亲编号为i/2,结果取整

性质2:便哈为i的结点的左孩子编号为2i,右孩子编号为2i+1

性质3:完全二叉树的结点总数为n,则该完全二叉树的高为log以2为底求n的对数,结果取整

二叉树的实现:

顺序存储:

对于完全二叉树和满二叉树可以利用完全二叉树的性质2来定位双亲和孩子的位置。如下图:

对于一般的二叉树,采取补值的方法将二叉树补成完全二叉树,再利用完全二叉树的顺序存储方式。

链式存储:

结点包含3个值:数据域、指向左子树的指针、指向右子树的指针

二叉树的遍历:

先根遍历:DLR
首先访问根结点然后遍历左子树,最后遍历右子树。在遍历左、右子树时,仍然先访问根结点,然后遍历左子树,最后遍历右子树。

中根遍历:LDR 首先遍历左子树然后访问根结点,最后遍历右子树。在遍历左、右子树时,仍然先遍历左子树,然后访问根结点,最后遍历右子树。

后根遍历:LRD 首先遍历左子树然后遍历右子树,最后访问根结点。在遍历左、右子树时,仍然先遍历左子树,然后遍历右子树,最后访问根结点。

树如何转换成二叉树?

步骤1:仅保留最左边孩子与根节点的连线,并连接兄弟结点。如下图,B是A最左边的孩子,所以保留A与B的连线,断开A与C,A与D的连线。B、C、D是兄弟,所以将BCD连接起来。对于以B、C、D为根的子树仍然按照这样的规则转换。

步骤2:左子树顺时针旋转45度,便得到了转换后的二叉树

二叉树如何转换成树?

步骤1:与树转换成二叉树的步骤相反,左子树逆时针旋转45度

步骤2:断开兄弟之间的连线,连接双亲。

森林如何转换成二叉树?

步骤1:每棵树都先转换为二叉树

步骤2:以第一棵树的根结点为根结点,将根结点依次连接起来

步骤3:按照根结点顺时针旋转45度

二叉树如何转换成森林?

步骤1:断开根结点与右子树的连线,对于右子树仍然按照规定断开与右子树的连线。这样得到多个二叉树

步骤2:将每棵二叉树转换为树

数据结构---树、二叉树、森林

时间: 2024-10-11 01:26:23

数据结构---树、二叉树、森林的相关文章

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

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

树 二叉树 森林 之间转换

树.森林和二叉树之间的转换 树转换为二叉树 1. 加线 在所有兄弟结点之间加一条连线. 2. 去线 树中的每个结点,只保留它与第一个孩子结点的连线,删除它与其它孩子结点之间的连线. 3. 层次调整 以树的根节点为轴心,将整棵树顺时针旋转一定角度,使之结构层次分明.(注意第一个孩子是结点的左孩子,兄弟转换过来的孩子是结点的右孩子) 森林转换为二叉树 1. 把每棵树转换为二叉树. 2. 第一棵二叉树不动,从第二棵二叉树开始,依次把后一棵二叉树的根结点作为前一棵二叉树的根结点的右孩子,用线连接起来.

数据结构与算法-----&gt;数据结构-----&gt;树-------&gt;二叉树的遍历

二叉树的遍历 第一部分 基本概念以及编程实现 概述: 遍历树,就是指按照一定的顺序访问树中的所有节点. 遍历树有三种常用方法,分别是中序遍历(inorder).前序遍历(preorder).后序遍历(postorder) 三种遍历方法的三个步骤都是相同的,只不过这三个步骤的执行顺序不同.三种遍历方式的名称的由来是根据""访问节点内容""这个步骤的执行时间来定的,这个步骤在第一步执行的是前序遍历,在第二步执行的是中序遍历,在第三步执行的是后序遍历. 1.1中序遍历(i

数据结构——第三章树和二叉树:03树和森林

1.树的三种存储结构: (1)双亲表示法: #define MAX_TREE_SIZE 100 结点结构: typedef struct PTNode { Elem data; int parent; //双亲位置域 } PTNode; (2)孩子双亲链表表示法: typedef struct PTNode { Elem data; int parent; //双亲位置域 struct CTNode* nextchild; } *ChildPtr; (3)树的二叉链表(孩子-兄弟)存储表示法:

javascript实现数据结构: 树和森林

树的3种常用链表结构 1 双亲表示法(顺序存储结构) 优点:parent(tree, x)操作可以在常量时间内实现 缺点:求结点的孩子时需要遍历整个结构 用一组连续的存储空间来存储树的结点,同时在每个结点中附加一个指示器(整数域) ,用以指示双亲结点的位置(下标值) . 图所示是一棵树及其双亲表示的存储结构.这种存储结构利用了任一结点的父结点唯一的性质.可以方便地直接找到任一结点的父结点,但求结点的子结点时需要扫描整个数组. 代码实现: 1 // 1.双亲表示法 2 // 优点:parent(t

python数据结构树和二叉树简介

一.树的定义 树形结构是一类重要的非线性结构.树形结构是结点之间有分支,并具有层次关系的结构.它非常类似于自然界中的树.树的递归定义:树(Tree)是n(n≥0)个结点的有限集T,T为空时称为空树,否则它满足如下两个条件:(1)有且仅有一个特定的称为根(Root)的结点:(2)其余的结点可分为m(m≥0)个互不相交的子集Tl,T2,…,Tm,其中每个子集本身又是一棵树,并称其为根的子树(Subree). 二.二叉树的定义 二叉树是由n(n≥0)个结点组成的有限集合.每个结点最多有两个子树的有序树

浅谈数据结构-树和二叉树之间关系

树都可用二叉链表作为存储结构,对比各自的结点结构可以看出,以二叉链表作为媒介可以导出树和二叉树之间的一个对应关系. ◆ 从物理结构来看,树和二叉树的二叉链表是相同的,只是对指针的逻辑解释不同而已. ◆ 从树的二叉链表表示的定义可知,任何一棵和树对应的二叉树,其右子树一定为空. 1 树转换成二叉树 对于一般的树,可以方便地转换成一棵唯一的二叉树与之对应.将树转换成二叉树在"孩子兄弟表示法"中已给出,其详细步骤是: ⑴ 加虚线.在所有兄弟结点之间加线. ⑵ 去连线.只保留大孩子(除最左的第

C#数据结构—树和二叉树

线性结构中的数据元素是一对一的关系,树形结构是一对多的非线性结构,非常类似于自然界中的树,数据元素之间既有分支关系,又有层次关系.树形结构在现实世界中广泛存在,如家族的家谱.一个单位的行政机构组织等都可以用树形结构来形象地表示.树形结构在计算机领域中也有着非常广泛的应用,如 Windows 操作系统中对磁盘文件的管理.编译程序中对源程序的语法结构的表示等都采用树形结构.在数据库系统中,树形结构也是数据的重要组织形式之一.树形结构有树和二叉树两种,树的操作实现比较复杂,但树可以转换为二叉树进行处理

浅谈数据结构-树

树是一种数据结构,其中一个元素可以有两个或者多个数据元素,具有一对多的特点,用树结构来存储文件. 树的概念 结点的度:子结点的个数.例如结点1中有3个子结点,结点1的度是3. 树的度:树的度等于所有结点度中度最高的值.结点最高的度为3,树的度为3. 叶子结点:度为0的结点,即没有子结点的结点.例如:上图中3,5,6,7,9,10. 分支结点:除了叶子结点以外的结点,即度不为0的结点.例如:上面树的分支结点为1,2,4,8. 内部结点:除了根结点以及叶子结点或在分支结点的基础之上在去掉根结点.例如