数据结构入门----树和森林的概念及应用
1. 树和森林的存储方式
什么是存储结构?
数据元素以及数据元素之间的逻辑关系在存储器中的表示。
实现树的存储结构,关键是什么?
如何表示树中结点之间的逻辑关系。
树中结点之间的逻辑关系是什么?
一对多
思考问题的出发点:如何表示结点的双亲和孩子
树有三种常用存储方式: ①双亲表示法 ②孩子表示法 ③孩子兄弟表示法
1、用双亲表示法来存储
思路:用一组连续空间来存储树的结点,同时在每个结点中附设一个指示器,指示其双亲结点在链表中的位置。
缺点:求结点的孩子时需要遍历整个结构。
2、用孩子表示法来存储
如何确定链表中的结点结构?
方案一:指针域的个数等于树的度(每个结点结构均相同)
缺点:浪费空间
方案二: 指针域的个数等于该结点的度(结点结构可不同)
缺点:结点结构不一致,结点结构定义复杂
思路:将每个结点的孩子排列起来,形成一个带表头(装父结点)的线性表(n个结点要设立n个链表); 再将n个表头用数组存放起来,这样就形成一个混合结构。
3、用孩子兄弟表示法来存储
思路:用二叉链表来表示树,但链表中的两个指针域含义不同。
某结点的第一个孩子是惟一的,某结点的右兄弟是惟一的 ---- >设置两个分别指向该结点的第一个孩子和右兄弟的指针。
树转换成二叉树 :用“左孩子右兄弟”表示法来存储即可,存储的过程就是转换的过程!
2. 树和森林与二叉树的转换
树和二叉树之间具有对应关系
森林转二叉树举例:
3. 树和森林的遍历
树的遍历
从根结点出发,按照某种次序访问树中所有结点,使得每个结点被访问一次且仅被访问一次。
遍历的实质 ----树结构(非线性结构)→线性结构。
树通常有前序(根)遍历、后序(根)遍历和层序(次)遍历三种方式。
树的遍历 ----前序遍历
操作定义为: 若树为空,则空操作返回;否则 ⑴ 访问根结点; ⑵ 按照从左到右的顺序前序遍历根结点的每一棵子树。
前序遍历序列: A B D E H I F C G
树的遍历 ----后序遍历
操作定义为: 若树为空,则空操作返回;否则 ⑴ 按照从左到右的顺序后序遍历根结点的每一棵子树; ⑵ 访问根结点。
后序遍历序列: D H I E F B G C A
树的遍历 ----层序遍历
操作定义为: 从树的第一层(即根结点)开始,自上而下逐层遍历,在同一层中,按从左到右的顺序对结点逐个访问。
层序遍历序列: A B C D E F G H I
注:以二叉链表作树的存储结构时,树的先根遍历和后根遍历可借用二叉树的先序遍历和中序遍历的算法实现之。
树的前序遍历等价于二叉树的前序遍历!
树的后序遍历等价于二叉树的中序遍历!
森林的遍历
先序遍历
若森林为空,返回;
访问森林中第一棵树的根结点;
先序遍历第一棵树中根结点的子树森林;
先序遍历除去第一棵树之后剩余的树构成的森林。
中序遍历
若森林为空,返回;
中序遍历森林中第一棵树的根结点的子树森林;
访问第一棵树的根结点;
中序遍历除去第一棵树之后剩余的树构成的森林。
注:森林的先序和中序遍历即为其对应的二叉树的先序和中序遍历。