树、二叉树、森林的转换

树转换为二叉树

(1)加线。在所有兄弟结点之间加一条连线。

(2)去线。树中的每个结点,只保留它与第一个孩子结点的连线,删除它与其它孩子结点之间的连线。

(3)层次调整。以树的根节点为轴心,将整棵树顺时针旋转一定角度,使之结构层次分明。(注意第一个孩子是结点的左孩子,兄弟转换过来的孩子是结点的右孩子)

森林转换为二叉树

(1)把每棵树转换为二叉树。

(2)第一棵二叉树不动,从第二棵二叉树开始,依次把后一棵二叉树的根结点作为前一棵二叉树的根结点的右孩子,用线连接起来。

二叉树转换为树

是树转换为二叉树的逆过程。

(1)加线。若某结点X的左孩子结点存在,则将这个左孩子的右孩子结点、右孩子的右孩子结点、右孩子的右孩子的右孩子结点…,都作为结点X的孩子。将结点X与这些右孩子结点用线连接起来。

(2)去线。删除原二叉树中所有结点与其右孩子结点的连线。

(3)层次调整。

二叉树转换为森林

假如一棵二叉树的根节点有右孩子,则这棵二叉树能够转换为森林,否则将转换为一棵树。

(1)从根节点开始,若右孩子存在,则把与右孩子结点的连线删除。再查看分离后的二叉树,若其根节点的右孩子存在,则连线删除…。直到所有这些根节点与右孩子的连线都删除为止。

(2)将每棵分离后的二叉树转换为树。

Reference:

[1] 《大话数据结构》

时间: 2025-02-01 09:54:04

树、二叉树、森林的转换的相关文章

树 二叉树 森林 之间转换

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

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

树的存储结构 双亲表示法 孩子表示法: (a)多重链表(链表中每个指针指向一棵子树的根结点); (b)把每个跟结点的孩子结点排列起来,看成一个线性表,且以单链表做存储结构.且N个头指针也组成一个线性表. 孩子兄弟表示法://二叉树表示法或二叉链表表示法 以二叉链表做树的存储结构,链表中结点的两个链域分别指向该结点的第一个孩子结点和下一个兄弟结点(fchild 和nsibling) //孩子兄弟表示法 typedef struct CSNode{ int data; CSNode *fchild

数据结构——第三章树和二叉树: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)树的二叉链表(孩子-兄弟)存储表示法:

二叉树、树、森林

树在数据结构中占有非常重要的地位.本文从树的基本概念入手,给出完美(Perfect)二叉树,完全(Complete)二叉树和完满(Full)二叉树的区别.如果学习过二叉树,但是对这三种二叉树并没有深入的理解,或者完全被国产数据结构教科书所误导(只听说过满二叉树和完全二叉树)的朋友不妨花点时间耐着性子将本文仔细阅读N(>=1)遍. 1. 树(Tree)的基本概念 1.1 树的定义 A tree is a (possibly non-linear) data structure made up of

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

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

5.5树和森林

5.5.1树的存储结构 树的存储结构通常采用如下三种表示方式. 1.双亲表示法 这种存储结构求指定结点的双亲(或祖先包括根)都是十分方便的. 但是在这种存储表示法中,求指定结点的孩子或其他后代则可能需要遍历整个结构. 2.孩子链表法 与双亲表示法相反,孩子链表表示法便于那些涉及孩子结点的操作的实现,而不适用操作Parent(T,x). 3.孩子兄弟表示法 这种存储结构的最大优点是,它和二叉树的二叉链表表示完全一样,因此可利用二叉树的各种算法来实现对树的操作. 5.5.2树.森林与二叉树的转换 树

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

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

树 二叉树 多叉树

本文先介绍了树的概念,然后给出了二叉树和多叉树的实现源码实例. 一.树的概念 树(本质上就使用了递归来定义的,递归就是堆栈应用,因此树离不开递归和堆栈):树是n个点的有限结合.n=0时是空树,n=1时有且仅有一个结点叫做根,n>1,其余的结点被分成m个互不相交的子集,每一个子集又是一棵树. 森林 二叉树 满二叉树 深度为k,结点个数是2的k次方-1的二叉树. 完全二叉树 深度为k,结点为n,当且仅当每一个结点的编号与对应的满二叉树完全一致. 顺序存储:访问方便 链式存储:删除方便 二叉排序树:对

树和森林

一.树的存储结构:孩子兄弟表示法----------->即二叉树表示法或二叉链表表示法 左指针指向孩子 右指针指向兄弟 ----------------------------------------------------------------------------------------- 给定一棵树,可以找到唯一的一棵树二叉树与之对应,从物理结构来看,他们的二叉链表是相同的,只是解释不通而已. 树                                            

纸上谈兵: 树, 二叉树, 二叉搜索树

树的特征和定义 树(Tree)是元素的集合.我们先以比较直观的方式介绍树.下面的数据结构是一个树: 树有多个节点(node),用以储存元素.某些节点之间存在一定的关系,用连线表示,连线称为边(edge).边的上端节点称为父节点,下端称为子节点.树像是一个不断分叉的树根. 每个节点可以有多个子节点(children),而该节点是相应子节点的父节点(parent).比如说,3,5是6的子节点,6是3,5的父节点:1,8,7是3的子节点, 3是1,8,7的父节点.树有一个没有父节点的节点,称为根节点(