8.遍历二叉树、线索二叉树、森林
思考
一.什么遍历二叉树、线索二叉树、森林?(What)
0.二叉树遍历一共(4种)
1.二叉树先序遍历
2.二叉树中序遍历
3.二叉树后序遍历
4.遍历分析
5.遍历二叉树
6.二叉树层次遍历
7.二叉树遍历算法的应用
1.建立二叉树
2.复制二叉树
3.计算二叉树深度
4.树结点总数
5.叶子结点树
8.线索二叉树
9.树和森林
1.树、森林定义
2.树的存储结构
10.树和二叉树的转换
1.树的二叉链表
2.二叉树的二叉链表
3.树转化成二叉树
4.二叉树转成树
5.森林转化成二叉树
6.二叉树转化成森林
11.树和森林的遍历
1.树的遍历:一共3种
2.森林的遍历
二.为什么需要遍历二叉树、线索二叉树、森林?(Why)
三.如何学好遍历二叉树、线索二叉树、森林?(How)
1.学习遍历二叉树、线索二叉树、森林,需要具备以下几点:
2.下面是一些学习二叉树、线索二叉树、森林的具体方法:
数据结构很重要!
数据结构很重要!!!
数据结构很重要!!!!
思考
1.什么遍历二叉树、线索二叉树、森林?(What)
2.为什么需要遍历二叉树、线索二叉树、森林?(Why)
3.如何学好遍历二叉树、线索二叉树、森林?(How)
注:特别感谢青岛大学王卓老师
第5章 树和二叉树.pdf
一.什么遍历二叉树、线索二叉树、森林?(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 遍历算法等。
- 进行多种不同类型的练习,包括手动模拟遍历过程、绘制二叉树的图形等,加深理解。
- 在学习过程中,多与其他人交流,包括教师、同学或社区中的其他人,分享经验和学习心得。
8.遍历二叉树、线索二叉树、森林相关推荐
- 二叉树前序中序后续线索树_二叉树的先序,中序,后序遍历以及线索二叉树的遍历...
二叉树的先序,中序,后序遍历以及线索二叉树的遍历 (2008-05-04 17:52:49) 标签: 杂谈 C++ 二叉树的先序,中序,后序遍历以及线索二叉树的遍历 头文件 //*********** ...
- (八)二叉树—线索二叉树
一.基本介绍 二.应用实例 package tree;public class ThreadedBinaryTree {public static void main(String[] args) { ...
- 【数据结构-树】2.二叉树遍历与线索二叉树(图解+代码)
一.二叉树的定义及其主要特征 1.1 二叉树的概念 二叉树是另一种树形结构,其特点是每个结点最多含两棵子树(也就是说,二叉树的度≤2). 二叉树是一种有序树,若将其左.右子树颠倒,则成为另一颗不同的二 ...
- 先序abdfcegh 中序bfdagehc 后序线索二叉树_二叉树的遍历和线索二叉树
二叉树的遍历是指按某条搜索路径访问树中的每个结点,使得每个结点均被访问一次,且只被访问一次. 先序遍历(NLR) 若二叉树为空,则什么也不做:否则, (1)访问根结点. (2)先序遍历左子树. (3) ...
- 【数据结构Note5】- 树和二叉树(知识点超细大全-涵盖常见算法 排序二叉树 线索二叉树 平衡二叉树 哈夫曼树)
文章目录 5.1 树和二叉树引入 5.1.1 树的概念 5.1.2 树的表示 5.1.3 树中基本术语 5.2 二叉树 5.2.1 概念 5.2.2 二叉树的性质 5.2.3 特殊的二叉树 5.2.4 ...
- 数据结构——前序线索二叉树及其前序遍历
/************************ author's email:wardseptember@gmail.com date:2017.12.26 前序线索二叉树的前序遍历 ****** ...
- 数据结构入门----遍历二叉树和线索二叉树
遍历二叉树(Traversing Binary Tree) 二叉树的遍历是指从根结点出发,按照某种次序访问二叉树中的所有结点,使得每个结点被访问一次且仅被访问一次. 实际应用中,查找树中符合条件的结点 ...
- 【练习】2021下半年数据结构刷题笔记和总结 (二) 树、查找-- 不同的排序算法、二叉排序树 平衡二叉树、哈希表查找、线索二叉树、
记录自己下半年写题目的记录.题目来自书或者网站. 练习(一)的地址: https://blog.csdn.net/qq_41358574/article/details/117098620?ops_r ...
- 深入学习二叉树(二) 线索二叉树
深入学习二叉树(二) 线索二叉树 1 前言 在上一篇简单二叉树的学习中,初步介绍了二叉树的一些基础知识,本篇文章将重点介绍二叉树的一种变形--线索二叉树. 2 线索二叉树 2.1 产生背景 现有一棵结 ...
- 数据结构之线索二叉树
线索二叉树 思维导图: 线索二叉数的引入: 线索二叉树: 前序遍历的线索二叉树: 中序遍历的线索二叉树(常): 后序遍历的线索二叉树: 线索二叉树的节点结构: 中序线索二叉树代码实现 中序线索二叉树的 ...
最新文章
- android 适配
- matplotlib plt.figure() 参数详细解释 对于绘制直方图 点图 的通用场景
- 5月22日阿里云网络变更公告
- 使用jpcap获取网卡硬件
- 窗口之间值、控件的传递
- input ios问题
- 点击Result list里product ID出现白屏的又一原因及分析
- screen 断开 screen -r 不能进入断开的会话
- js中执行到一个if就停止的代码_Node 中如何引入一个模块及其细节
- 1.8 编程基础之多维数组 09 矩阵乘法 6分 python
- 什么情况下不应该使用深度学习?
- 手动配置gradle
- echarts使用_做数据可视化,为什么我们不再直接使用D3.js、Echarts
- PyQT多线程串口 QtDesigner
- Java 类加载器详解
- 计算机组成原理中rr,计算机组成原理作业~第四章.doc
- 3060ti适配的cuda和cudnn
- HarmonyOS APP开发入门3——组件(二 Text组件)
- STM32f4系列ADC解析
- 人生感悟:影响人成功和幸福的21点
热门文章
- linux上使用ftdi的串口芯片,D2XX for Linux,出现ftdi d2xx与linux上的ftdi_sio冲突问题
- 金明的预算budget题解
- 北斗/GPS定位模块冷启动、热启动、温启动有什么区别?
- 如何通过Darkvm注册阿里云国际版?
- 虚拟机kali升级最新_虚拟机中安装kali 2020.3 史上最详细教程
- Python实现Excel办公自动化
- 计算机连接电视显示超范围,HDMI连接后电脑操作界面的边框超出电视屏幕,怎么解决...
- AIOps 在腾讯的探索和实践
- lululemon女性鞋履系列携AR试穿体验首发上线
- 动态拼图怎么做?如何将多张动图拼接在一起?