树——通用树到二叉树的转换

1,已经创建了通用树结构,有必要创建另一种树结构吗?

2,简化树就直接减少结点中孩子的数量,但是这样树还能通用吗?

3,通用树结构的回顾:

1,双亲孩子表示法:

1,每个结点都有一个指向双亲的指针;

2,每个结点都有若干个指向其孩子的指针;

4,另一种树结构模型:

1,孩子兄弟表示法:

1,每个结点都有一个指向其第一个孩子的指针;

2,每个结点都有一个指向其第一个右兄弟的指针;

1,孩子兄弟表示法可以描述普通的树型结构,因为通过根结点可以访问到这一个树形结构的每一个结点;

5,孩子兄弟表示法的特点:

1,能够表示任意的树形结构;

2,每个结点包含一个数据成员和两个指针成员;

1,形态相对固定,实现相对简单;

3,孩子结点指针和兄弟结点指针构成了“树杈”;

1,二叉表示法就是“孩子兄弟”表示模型,其抽象后就是二叉树,但实现不是用“孩子兄弟”指针实现的;

2,二叉树是即将讨论的内容,不在关注通用树及其在二叉或者“孩子兄弟”表示法下是如何转换的,重点放在二叉树的相关内容创建和算法研究;

6,二叉树的定义:

1,二叉树是由 n(n >= 0)个结点组成的有限集合,该集合或者为空,或者是由一个根结点加上两颗分别称为左子树和右子树的、互不相交的二叉树组成;

7,二叉树五种形态:

1,二叉树结点只有三种形态,依据子结点数目分;

8,特殊二叉树:

1,满二叉树(Full Binary Tree):

1,如果二叉树中所有分支结点的度数都为 2,且叶子结点都在同一层次上,则称这类二叉树为满二叉树;

1,除了叶结点,任何分支结点度数都为 2,且叶结点在同一层次;

2,完全二叉树(Complete Binary Tree):

1,如果一棵具有 n 个结点的高度为 k 的二叉树,它的每一个结点都与高度为 k 的满二叉树编号为 1到 n 的结点一一对应,则称这棵树为完全二叉树。(从上到下从左到右编号)

9,完全二叉树特性:

1,同样结点数的二叉树,完全二叉树的高度最小;

1,按顺序排列的;

2,完全二叉树的叶结点仅出现在最下面两层:

1,最底层的叶结点一定出现在左边;

2,倒数第二层的叶结点一定出现在右边;

3,完全二叉树中度为 1 的结点只有左孩子;

1,完全二叉树是还没形成的满二叉树,满二叉树是完全二叉树;

10,小结:

1,通用树结构采用了双亲结点表示法进行描述;

2,孩子兄弟表示法有能力描述任意类型的树结构;

3,孩子兄弟表示法能够将通用树转化为二叉树;

4,二叉树是最多只有两个孩子的树;

原文地址:https://www.cnblogs.com/dishengAndziyu/p/10925370.html

时间: 2024-10-07 20:25:53

树——通用树到二叉树的转换的相关文章

树——通用树结点的清除

1,树是一种数据结构,用来存储容器,因此它可以用来看做一种容器类型:既可以向容器中插入东西,也可以将容器中的东西倒出来: 2,清除操作的定义: 1,void clear(): 1,将树中的所有结点清除(释放堆中的结点): 3,树中数据元素的清除: 1,递归清除: 4,清除操作功能的定义: 1,free(node) 1,清除 node 为根结点的树: 2,释放树中的每一个结点: 2,功能函数代码实现: 1 /* 清除 node 树的根结点 */ 2 void free(GTreeNode<T>*

[转载]树、森林和二叉树的转换

本文转载自:http://www.cnblogs.com/zhuyf87/archive/2012/11/04/2753950.html 树转换为二叉树 (1)加线.在所有兄弟结点之间加一条连线. (2)去线.树中的每个结点,只保留它与第一个孩子结点的连线,删除它与其它孩子结点之间的连线. (3)层次调整.以树的根节点为轴心,将整棵树顺时针旋转一定角度,使之结构层次分明.(注意第一个孩子是结点的左孩子,兄弟转换过来的孩子是结点的右孩子) 森林转换为二叉树 (1)把每棵树转换为二叉树. (2)第一

树,森林与二叉树的转换

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

树、森林和二叉树的转换

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

树——通用树的存储结构与结点实现

1,上篇博文介绍了树的定义和相关概念定义,本节课创建树对象和树结点对象: 2,课程目标: 1,完成树和结点的存储结构设计: 1,没有树结点,就没有树,同生死: 3,设计要点: 1,GTree 为通用树结构,每个结点可以存在多个后继结点: 2,GTreeNode 能够包含任意多指向后继结点的指针: 3,实现树结构的所有操作(增,删,查,等): 1,抽象类只用包含功能函数,具体的对象才包含成员变量和实现功能函数: 4,GTreeNode 的设计与实现: 1,组合单链表类,因为要包含任意多指向结点的指

树——通用树的层次遍历

1,为何及如何按层次遍历通用树中的每一个数据元素? 1,通用树结构是一种容器类型的树结构,其用来装数据元素,所以应该提供一种方法来遍历树中的每一个数据结构: 2,往下分析: 2,当前的事实: 1,树是非线性的数据结构,树的结点没有固定的编号方式: 1,也就不能像链表一样统一编号来访问: 3,新的需求: 1,为通用树结构提供新的方法,快速遍历每一个结点: 4,设计思路(游标): 1,在树中定义一个游标(GTreeNode<T>*): 2,遍历开始前将游标指向根结点(root()): 3,获取游标

树 森林与二叉树的转换

1.树.森林为什么向二叉树转换? 因为在实际的处理问题中,大多数情况都是一对多,就向树.森林这样的数据结构! 而对于二叉树我们已经很熟悉了,所以转向我们所熟悉的结构,好处理. 2.孩子兄弟树的方法 把握左孩子右兄弟的原则: (1).树与二叉树的转换:i>以树的根结点为二叉树的根节点: ii>左孩子指针指向该根节点的第一个子结点: iii>右孩子指针指向"兄弟结点" (2).二叉树表示森林:i>二叉树的根结点是森林中第一棵树的根结点 ii>根结点的右孩子为森

树与二叉树的转换与遍历

树的初始化函数(双亲法和孩子结点法两种), 建树函数, 输出树函数, 树的前序遍历函数(递归和非递归两种), 树的后序遍历函数(递归和非递归两种), 树的层次遍历函数, 一般树和二叉树的转换函数. 主菜单和副菜单. 主函数. 具体代码如下: #include <stdio.h> #include <malloc.h> #include <stdlib.h> //设置常量: #define MAX_TREE_SIZE 100 //一般树的存储结构有以下几种:双亲结点,孩子

树/森林和二叉树的转换

树转二叉树 左儿子右兄弟,即第一个儿子是左二子,第一个兄弟是右儿子,然后按层次按顺序调整每一个即可. 规范做法是三步: 加线: 同一层的兄弟按顺序加线. 去线: 保留第一个儿子,其他儿子连线删掉. 调整层次. 森林转二叉树 先将每个树转成二叉树,然后从第二棵开始,把每一棵二叉树的根都作为前一棵的右儿子. 二叉树转树 根据树转二叉树,考虑逆过程,如果一个节点有左儿子,那么这个左二子的右儿子,右儿子的右儿子,...都是该节点的兄弟节点. 规范做法也是三步: 加线: 左儿子的右儿子,左儿子的右儿子的右