提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
在我们了解树和二叉树的基本知识后,我们紧接着就要开始学习树的进阶应用。学习二叉树的存储结构,遍历二叉树和线索二叉树,还要知道如何将树和二叉树相互转换。除此之外,我们还会简单了解哈夫曼树的相关内容。
一、二叉树的顺序存储
按满二又树的结点层次编号,依次存放二又树中的数据元素
二叉树的顺序存储缺点
最坏情况:深度为k的且只有 k个结点的单支树需要长度为2的k次方-1 的一维数组。
特点:
结点间关系蕴含在其存储位置中浪费空间,适于存满二又树和完全二又树
二、二叉树的链式存储结构
例如以上的二叉树,将其进行存储,将其转化为:
补充:
必有2n个链域。除根结点外每个结点有且仅有一个双亲,所以只会有n-1个结点的链域存放指针,指向非空子女结点。
二叉树的链式存储结构可以这样简单理解
三、三叉链表
为了克服二叉链表中的一些弊端,在存储过程中方便找到孩子的双亲,于是设计了三叉链表来解决问题。
三叉链表就是在二叉连链表的基础上增加一个指针域,指针指向双亲
四、遍历二叉树
1.先序二叉树
(1)访问根结点;
(2)先序遍历左子树;
(3)先序遍历右子树。
先序遍历的顺序为:a b c
2.中序二叉树
(1)中序遍历左子树;
(2)访问根结点;
(3)中序遍历右子树。
中序遍历的顺序为:b a c
3.后序二叉树
(1)后序遍历左子树;
(2)后序遍历右子树;
(3)访问根结点。
后序遍历的顺序为:b c a
4.层次二叉树
(1)对于一颗二叉树,从根结点开始,按从上到下、从左到右的顺序访问每一个结点。
(2)每一个结点仅仅访问一次
五、树转化成二叉树
- 加线:在兄弟之间加一连线
2.抹线:对每个结点,除了其左孩子外,去除其与其余孩子之间的关系
3.旋转:以树的根结点为轴心,将整树顺时针转45°
示例树
示例二叉树
六、将二叉树转化成树
- 加线:若p结点是双亲结点的左孩子,则将p的右孩子,右孩子的右孩子.……沿分支找到的所有右孩子,都与p的双亲用线连起来。
2.抹线:抹掉原二又树中双亲与右孩子之间的连线。
- 调整:将结点按层次排列,形成树结构。
示例二叉树
示例树
七、哈夫曼树
1.哈夫曼树的基本概念
权:
将树中结点赋给一个有着某种含义的数值则这个数值称为该结点的权。
结点的带权路径长度:
从根结点到该结点之间的路径长度与该结点的权的乘积。
树的路径长度:
从树根到每个结点的路径长度之和
//结点数目相同的二叉树中,完全二叉树是路径长度最短的二叉树
树的带权路径长度:
树中所有叶子结点的带权路径长度之和
2.哈夫曼树的应用
1.带权路径长度(WPL)
有4个结点分别为a, b, c, d;权值分别为4,3,9,6
带权路径长度为:
WPL=4x2+3x2+9x6+6x2=44
总结
以上内容更进一步的为大家介绍了树和二叉树的知识,希望大家对其可以有更加系统的认知。如果以上内容对大家的学习有所帮助,希望大家可以点赞支持一下!