数据结构很重要!
数据结构很重要!!!
数据结构很重要!!!!
思考
1.什么遍历二叉树、线索二叉树、森林?(What)
2.为什么需要遍历二叉树、线索二叉树、森林?(Why)
3.如何学好遍历二叉树、线索二叉树、森林?(How)
注:特别感谢青岛大学王卓老师
一.什么遍历二叉树、线索二叉树、森林?(What)
0.二叉树遍历一共(4种)
- 先序遍历
- 中序遍历
- 后序遍历
- 层次遍历
1.二叉树先序遍历
2.二叉树中序遍历
3.二叉树后序遍历
4.遍历分析
5.遍历二叉树
6.二叉树层次遍历
第一个先入队,一旦出队,孩子节点立马进队。
7.二叉树遍历算法的应用
1.建立二叉树
目前画了一棵二叉树
注:空的结点用#表示
1.输入一个字符,如果为#,则T则指向空节点,然后返回OK(指针回到上一层)
2.否则,如果T空间没有分配成功,则报错。
3.生成根结点,T->data=ch
4.构造左子树 CreateBiTree(T->lchild)
5.构造右子树 CreateBiTree(T->rchild)
2.复制二叉树
1.如果是空树,递归结束
2.否则,申请新结点空间,复制根结点
-
-
- 递归复制左子树
- 递归复制右子树
-
3.计算二叉树深度
如果是空树,则深度为0;
否则,递归计算左子树的深度记为m,
递归计算右子树的深度记为n,
看m与n的较大者+1
4.树结点总数
如果是空树,则节点个数为0;
否则,结点个数为左子树的结点个数+右子树的结点个数+1
5.叶子结点树
如果是空树,则叶子结点个数为0
否则,为左子树的叶子结点个数+右子树大的叶子结点个数
核心:
1.如果左孩子和右孩子,都为空,则叶子结点返回1
8.线索二叉树
无法直接找到该结点,在某种遍历与列中的前驱和后继节点
解决办法:
1.通过遍历寻找——费时间
2.再增设前驱、后继指针域——增加了存储负担
3.利用二叉链表中的空指针域。
左孩子为空,将左孩子指针域改为指向其前驱(是指:线性排好后,元素的前驱)
根左右有孩子:0
根左右没有孩子:1
左空:前
又空:后
9.树和森林
1.树、森林定义
树:有且仅有一个特定的根,其余结点可以分为m个树。
森林:m棵互不相交的树的集合。
2.树的存储结构
1.双亲表示法
用数组存储:数据域+双亲域(上一结点存储位置)
data parent
0 R -1
1 A 0
1 B 2
r=0; //根结点位置
n=10; //结点个数
2.孩子链表
n个结点由n个孩子链表
叶子的孩子链表为空表
数组+链表
数组下标 数据 第一个孩子下的所有元素
0 A 3 5
1 B
2 C 6
孩子链表:找孩子容易
带双亲的链表,既能找孩子又能找双亲。
3.孩子兄弟表示法
找孩子容易,找兄弟容易
找双亲不容易。
每个结点的俩个指针域分别指向其第一个孩子节点 和 下一个兄弟节点
4.总结:
1.双亲表示法
优点:找双亲容易
2.孩子链表
优点:找孩子容易
3.孩子兄弟表示法
找孩子和兄弟容易
10.树和二叉树的转换
1.树的二叉链表
2.二叉树的二叉链表
3.树转化成二叉树
每个结点指向他的 左孩子 和 下一个兄弟节点
加线:兄弟之间加一连线
抹线:除左孩子外,抹掉其他孩子与父节点的连线
旋转:以树的根为轴心,将整树顺时针旋转45°
口诀:兄弟相连留长子
4.二叉树转成树
加线:若p节点是父节点的左孩子,将p的右孩子,右孩子的右孩子.....沿分支找到所有的右孩子,都与p的父节点连线起来。
抹线:去掉原来右孩线
调整:将节点按层次排列,形成树形结构
5.森林转化成二叉树
将各棵树分别转换成二叉树
将每棵树的根结点用线相连
以第一颗树根为二叉树的根,再以根结点为轴心,顺时针旋转,构成二叉树。
6.二叉树转化成森林
去掉全部右孩线,孤立二叉再还原。
11.树和森林的遍历
二叉树:一共有4种遍历,最后一种是层次遍历。
1.树的遍历:一共3种
1.先根
2.后根
3.层次遍历
注:没有中根,树不知道放在中间哪个地方好。
2.森林的遍历
1.先序遍历
2.中序遍历
方法2:
也可以按照树的后根遍历,遍历每一棵树,即可得到结果。
二.为什么需要遍历二叉树、线索二叉树、森林?(Why)
1.需要遍历,实现功能:遍历二叉树、线索二叉树、森林是因为在对这些数据结构进行操作时,需要按照一定的顺序依次访问它们的节点,以实现特定的功能。
2.搜索、排序、输出:具体来说,遍历二叉树是指按照某种规定的顺序访问二叉树中的所有节点,包括先序遍历、中序遍历、后序遍历等。通过二叉树的遍历,可以对二叉树中的节点进行搜索、排序、输出等操作,这在数据处理和算法实现中非常常见。
3.线索二叉树提高查询效率:是在普通二叉树的基础上,增加了一些额外的信息,如前驱节点和后继节点,可以提高在二叉树上的查找效率。遍历线索二叉树可以按照线索信息的顺序依次访问节点,而不需要像遍历普通二叉树一样需要递归遍历。
4.森林是由多棵树组成的数据结构,遍历森林也需要按照一定的顺序访问其中的树和节点,可以通过前序遍历、中序遍历、后序遍历等方式进行。在对森林进行遍历时,可以处理多个树中的节点信息,实现一些复杂的操作,如树的合并、划分等。
总之,对于这些数据结构,遍历是一种非常基础和重要的操作,可以帮助我们实现各种各样的算法和数据处理任务。
三.如何学好遍历二叉树、线索二叉树、森林?(How)
1.学习遍历二叉树、线索二叉树、森林,需要具备以下几点:
- 掌握二叉树的基本概念和性质。
- 熟悉二叉树的存储结构,包括顺序存储和链式存储。
- 了解二叉树的遍历方式,包括先序遍历、中序遍历和后序遍历。
- 熟悉线索二叉树和森林的概念和基本性质。
- 学会使用递归和非递归的方法进行二叉树的遍历和线索化。
- 进行多种不同类型的练习,包括编写程序、手动模拟遍历过程等,加深理解。
2.下面是一些学习二叉树、线索二叉树、森林的具体方法:
- 通过课程或教材系统地学习二叉树、线索二叉树、森林的相关概念、算法和应用。
- 练习手写二叉树的遍历和线索化算法,了解二叉树遍历的递归和非递归方法,加深理解。
- 通过编写程序实现二叉树遍历和线索化算法,实践中不断提升算法能力。
- 参考优秀的算法书籍或网站,学习其他高效的遍历和线索化算法,例如 Morris 遍历算法等。
- 进行多种不同类型的练习,包括手动模拟遍历过程、绘制二叉树的图形等,加深理解。
- 在学习过程中,多与其他人交流,包括教师、同学或社区中的其他人,分享经验和学习心得。