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

              

结点结构:

typedef struct CSNode

{

  Elem data;

  struct CSNode *firstchild, *nextsibling;

} CSNode, *CSTree;

2.森林和二叉树的对应关系:

设森林:F = (T1, T2, ... , Tn); T1 = (root, t11, t12, ... , t1m);

二叉树:B = (LBT, Node(root), RBT);

(1)由森林转换成二叉树的转换规则为:若F = ?,则B = ?;否则,由ROOT(T1)对应得到Node(root);由(t11, t12, ... , t1m)对应得到LBT;由(T2, T3, ... , Tn)对应得到RBT。

(2)由二叉树转换为森林的转换规则为:若B = ?,则F = ?;否则,由Node(root)对应得到ROOT(T1);由LBT对应得到(t11,t12, ... , t1m);由RBT对应得到(T2, T3, ... , Tn)。

(和树对应的二叉树,其左、右子树的概念,已改变为左是孩子,右是兄弟)

3.树转换为二叉树:将一棵树转换为二叉树主要根据树的孩子-兄弟存储方式,方法是:

(1)树中所有相邻兄弟之间加一条连线;

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

(3)以树的根结点为轴心,将整棵树顺时针旋转一定角度,使之结构层次分明

4.森林转换为二叉树:森林是若干棵树的集合。树可以转换为二叉树,森林同样也可以转换为二叉树。因此,森林也可以方便地使用孩子-兄弟链表表示。森林转换为二叉树的方法如下:

(1)将森林中的每棵树转换成相应的二叉树。

(2)第一棵二叉树不动,从第二棵二叉树开始,依次把后一棵二叉树的根结点作为前一棵二叉树根结点的右孩子,当所有二叉树连在一起后,所得到的二叉树就是由森林转换得到的二叉树。

5.二叉树还原为树或森林:树和森林都可以转换为二叉树,二者的不同是:树转换成的二叉树,其根结点必然无右孩子,而森林转换后的二叉树,其根结点有右孩子。将一棵二叉树还原为树或森林,具体方法如下:

(1)若某结点是其双亲的左孩子,则把该结点的右孩子、右孩子的右孩子...都与该结点的双亲结点用先线连起来。

(2)删掉原二叉树中所有双亲结点与右孩子结点的连接。

(3)整理由前两步所得到的树或森林,使之结构层次分明。

6.

原文地址:https://www.cnblogs.com/hou36/p/9906520.html

时间: 2024-10-12 20:46:10

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

数据结构——第三章树和二叉树:01树和二叉树的类型定义

1.树的类型定义: (1)数据对象D:D是具有相同特性的数据元素的集合. (2)数据关系R:若D为空集,则成为空树 否则:在D中存在唯一的称为根的数据元素root.当n>1时,其余结点可分为n(n>0)个互不相交的有限集T1, T2, T3, ..., Tm,其中每一棵子集本身又是一课符合本定义的树,称为根root的子树. 2.树的基本操作: (1)查找类: ①Root(T):求树的根结点 ②Value(T, cur_e):求当前结点的元素值 ③Parent(T, cur_e):求当前结点的双

数据结构(三十九)多路查找树(B树)

一.多路查找树的背景 前面所讨论的查找算法都是在内存中进行的,它们适用于较小的文件,而对于较大的.存放在外存储器上的文件就不合适了,对于此类大规模的文件,即使是采用了平衡二叉树,在查找效率上仍然较低. 如果要操作的数据集非常大,大到内存已经没办法处理了,这种情况下,对数据的处理需要不断从硬盘等存储设备中调入或调出内存页面.一旦涉及到这样的外部设备,关于时间复杂度的计算就会发生变化,访问该集合元素的时间已经不仅仅是寻找该元素所需比较次数的函数,必须考虑对硬盘等外部存储设备的访问时间以及将会对该设备

数据结构——第三章树和二叉树:02二叉树

1.二叉树的存储结构: (1)二叉树的顺序存储表示: #define MAX_TREE_SIZE 100 //二叉树的最大结点数 typedef TElemType SqBiTree[MAX_TREE_SIZE]; SqBiTree bt; (2)二叉树的链式存储表示: ①二叉链表: typedef struct BiTNode //结点结构 { TElemType data; struct BiTNode *lchild, *rchild; //左右孩子指针 } BiTNode, *BiTre

数据结构(三):非线性逻辑结构-二叉树

接着上一次对非线性逻辑数据结构树的内容,开启对二叉树的深入复习和总结.首先还是先回顾一下几个重要的概念: 一.回顾 1. 满二叉树与完全二叉树 满二叉树指的是除了叶子节点外所有的节点都有两个子节点.这样可以很容易的计算出满二叉树的深度,要掌握满二叉树的一些性质. 完全二叉树则是从满二叉树继承而来,指的所有的节点按照从上到下,从左到右的层次顺序依次排列所构成的二叉树称之为完全二叉树.所以可以想象,对于深度为h的完全二叉树,前h-1层可以构成深度为h-1的满二叉树,而对于第h层则是从左到右连续排列的

剑指offer-第三章高质量代码(树的子结构)

题目:输入两个二叉树A和B,判断B是不是A的子结构. 思路:遍历A树找到B树的根节点,然后再判断左右子树是否相同.不相同再往下找.重复改过程. 子结构的描述如下图所示: C++代码: #include<iostream> using namespace std; struct BinaryTreeNode { int m_nValue; BinaryTreeNode* m_pLeft; BinaryTreeNode* m_pRight; }; BinaryTreeNode* Construct

C语言数据结构——第三章 栈和队列

三.栈和队列 栈和队列是两种重要的线性结构.从数据结构的角度来看,栈和队列也是线性表,它的特殊性在于栈和队列的基本操作是线性表操作的子集,它们的操作相对于线性表来说是受到限制的,因此,可以称其为限定性的数据结构. 从数据类型的角度看,它们是和线性表大不相同的两种重要的抽象数据类型,在面向对象的程序设计中,它们是多型数据类型. 3.1-栈 3.1.1-抽象数据类型栈的定义 栈:是限定仅在表尾进行插入或删除操作的线性表,又可以称为后进先出的线性表. 栈顶:栈的表尾端 栈底:栈的表头端 空栈:不含元素

【自考】数据结构第三章,队列,期末不挂科指南,第4篇

队列 这篇博客主要介绍一下队列的概念,并且采用C语言,编写两种存储实现方式:顺序存储和链式存储,当然还有常规的队列基本操作的实现算法 队列基本概念 标准解释:队列(Queue)是有限个同类型数据元素的线性序列,是一种先进先出(First In First Out FIFO)的线性表,新键入的数据元素插在队列尾端,出队列的数据元素在队列首部被删除. 教材中给了一个示意图,不错 顺序队列结构类型中有三个域:data.front.rear. data:一维数组,存储队列中的数据元素 font:指向队列

【自考】数据结构第三章,数组,期末不挂科指南,第5篇

数组 概念如下 数组可以看成线性表的一种推广,其实就是一种线性表,一维数组又称为向量 数据由一组具有相同类型的数据元素组成,并存储在一组连续的存储单元中 若一维数组中的数据元素又是一维数组结构,则称为二维数组 依次类推,可以得到 三维数组和多维数组 数组基本运算 数组通常只有两种基本运算 读:给定一组下标,返回该位置的元素内容 写:给定一组下标,修改该位置的元素内容 数组的存储结构 一维数组元素的内存单元地址是连续的 二维数组可有两种存储方法:一种是以列序为主序的存储:另一种是以行序为主序的存储

数据结构——第三章 栈

先入后出 1.栈的进出问题(题目一般只说入栈顺序,而没说啥时候出来) 2.逆波兰式(栈的后缀表示,从中缀转后缀) 例: (a+b)*3 +2 运算符在两个操作数中间,为中缀表达式 因为电脑太笨,所以需要将中缀表达式转换成后缀表达式,利用栈进行计算. 算法: 如何将中缀表达式转换成后缀表达式? 1.按执行的先后顺序,给表达式全部加上括号 2.把所有运算符移到右括号的后面 3.把所有的括号删除 例: a/b^c+d*e-a*c 1.这个式子需要这样计算 (((a/(b^c))+(d*e) )-(a*