数据结构之二叉树,二叉树存储结构,二叉树遍历,霍夫曼树以及图解
数据结构之二叉树
树
什么是树?
树是一种一对多的数据结构。树有很多子集,比如:二叉树、完全二叉树、满二叉树、二叉搜索树等等。
树的特征:
- 没有父结点的叫做根,一个树有且只有一个根;
- 每个结点有0个或者多个子结点;
- 一棵树可以拥有子树,且不能相交;
树的案例:
度
什么是度:
每个结点拥有的子结点数量称为该结点的度。如上图D的结点度为3,度为0的结点称为叶结点,也就是没有子结点的结点。
树的深度
树中结点最大层次树称为树的深度或高度。
二叉树
二叉树是一种特殊的树,二叉树的特征:
- 每个结点最多有2个子结点的树,也就是不存在度大于2的情况
- 左右子树有一定的顺序(比如升序和降序),次序不能颠倒
- 即使树中某结点只有一棵子树,也要区分它是左子树还是右子树
二叉树性质:
- 在二叉树的第i层上最对有2^-1个节点,(i >= 1)
- 二叉树中如果深度为k,那么最多有2^k-1个节点,(k >=1)
- n0 = n2 + 1;n0表示度数为0的节点数(就是没有子节点的结点,可以理解成叶结点),n2表示度数为2的节点数。
- 在完全二叉树中,具有n个节点的完全二叉树深度为【log2n】+1,其中【log2n】是向下取整的
- 若对含n个结点的完全二叉树从上到下从左到右进行1至n的编号,则对完全二叉树中任意一个编号为i的结点有以下特征:
- 若i=1;则该结点是二叉树的根,无双亲;否则,编号为【i/2】的结点为其双亲结点;
- 若2i>n;则该结点无左孩子,否则编号2i的结点为左孩子结点
- 若2i + 1 > n;则该结点无右孩子,否则2i+1的结点为右孩子结点
满二叉树:
在一棵二叉树中,如果所有分支结点都存在左子树和右子树,并且所有叶子都在同一层上,这样的二叉树称为满二叉树。
也是所有非叶结点的子结点个数都为2,看起来呈水平对称。
特点:
- 叶子结点只能出现在最下面一层
- 非叶结点的度一定是2
- 在同样深度的二叉树中,满二叉树的结点个数最多,叶子树最多
完全二叉树:
特征:
- 该树非最后一层的结点都是满的
- 最后一层的叶结点必须集中在左边,也就是不允许倒数第二层的结点只有右子结点而没有左子结点
- 同样结点数目的二叉树,完全二叉树深度最小
满二叉树一定是完全二叉树,但完全二叉树不一定是满二叉树
二叉树的存储结构
- 顺序存储
二叉树的顺序存储结构就是使用一维数组存储二叉树中的结点,并且结点的存储位置就是数组下表索引。
采用顺序存储,是合理的
当二叉树不为完全二叉树时
顺序存储结构图
其中^表示此位置没有存储结点,已经出现了空间浪费
因此:顺序存储一般适用于完全二叉树
2.二叉链表
既然顺序存储不能满足二叉树的存储要求,那么考虑采用链式存储,有二叉树的定义而知,二叉树的每个结点最多有两个子结点,因此可以将结点数据结构定义成一个数据和两个指针域。
图示:
Lchild(左孩子指针) |
Data(数据域) |
Rchild(右孩子指针) |
链表结构存储二叉树,称为二叉链表
二叉树遍历
二叉树遍历指从二叉树的根结点出发,按照某种次序访问二叉树中的所有结点,使得每个结点都被访问一次,且仅被访问一次。
访问次序可以分为四种:
- 前序遍历
从根结点出发,当第一次到达结点就输出结点数据,按照先左再右的方向访问
如图:
执行步骤:
从根结点,第一次到达A,输出A
继续向左,到达B,输出B
同样规则输出D、H
当到达叶结点H,返回D,此时已经第二次到达D,不再输出,开始向D右子树访问,不为空,访问到I,输出I
I为叶结点返回D,D的左右子结点访问完毕,返回到B,B右子树不为空,访问到E,输出E,依次类推
最终输出:ABDHIEJCFG
- 中序遍历
从根结点出发,每二次到达结点时就输出结点数据,按照先左后右
最终输出:HDIBJEAFCG
- 后序遍历
从二叉树根结点出发,每三次到达的结点时就输出该结点数据,按照先左后右
最终输出:HIDJEBFGCA
- 层次遍历
按照树的层次自上而下的遍历二叉树
最终输出:ABCDEFGHIJ
二叉树之霍夫曼树
霍夫曼树是二叉树的一种特殊方式,又称最优二叉树,其主要作用在于数据压缩和编码长度的优化。
- 路径和路径长度
路径:从一棵树中,从一个结点往下可以到达孩子或者孙子结点之间的通路叫做路径,通路中分支的数目称为路径长度。若规定根结点的层数为1,则从根结点到第L层结点的路径长度为L-1
A到D路径长度为2,A到C路径长度为1
- 结点的权以及带权路径的长度
权:若数中结点赋有某种含义的数值,把这个数值称为权
带权路径的长度:从根结点到该结点之间的路径长度与该结点的权的乘积
树的带权路径长度=所有叶子结点的带权路径长度之和,记做WPL
WPL=6*2+3*2+8*2
霍夫曼树
给定n个权值作为n个叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称霍夫曼树。
3.1.a WPL = 7*2 + 5*2 + 2*2 + 4*2=36
3.2.a WPL = 7*1 + 5*2 + 2*3 + 4*3=35
由ABCD构成叶子结点的二叉树形态有许多种,但是WPL最小的树只有3.1.b所示的形态。则3.1.b树为一棵霍夫曼树。
二叉排序树
二叉排序树又称二叉查找树,也称二叉搜索树。
二叉排序树或者是一棵空树,或者是具有下列性质的二叉树:
- 若左子树不能空,则左子树上所有结点的值均小于或等于它的根结点的值
- 若右子树不能空,则左子树上所有结点的值均大于或等于它的根结点的值
- 左右子树也分别为二叉排序树
例子:
现有序列:61 87 59 47 35 73 51 98 37 93
索引 i = 0,A[i] = 61,结点61作为根结点
数据结构之二叉树,二叉树存储结构,二叉树遍历,霍夫曼树以及图解相关推荐
- 数据结构(二叉树相关、满、完全二叉树、霍夫曼树、排序方法及时间复杂度总结、)笔记-day11
目录 前言 一.树(Tree) 1.1树及特征 1.2二叉树概念及性质 1.3二叉树存储结构及遍历 1.4链式存储编码 二.霍夫曼树(最优二叉树) 2.1权值及带权路径长度 2.2霍夫曼树特征及构建 ...
- 数据结构与算法之Huffman tree(赫夫曼树 / 霍夫曼树 / 哈夫曼树 / 最优二叉树)
目录 赫夫曼树概述 定义 构造赫夫曼树步骤 代码实现 赫夫曼树概述 HuffmanTree因为翻译不同所以有其他的名字:赫夫曼树.霍夫曼树.哈夫曼树 赫夫曼树又称最优二叉树,是一种带权路径长度最短的二 ...
- 二叉树合集(二):霍夫曼树(图文详解)
合集地址 二叉树合集(一):二叉树基础(含四种遍历,图文详解) 二叉树合集(二):霍夫曼树(图文详解) 二叉树合集(三):线索二叉树(图文详解) 二叉树合集(四):对称二叉树(递归和迭代实现) 二叉树 ...
- 霍夫曼树(最优二叉树)的实现
文章目录 一.相关概念 1.节点的路径及路径长度 2.节点的带权路径长度 3.树的带权路径长度 4.霍夫曼树 二.构建步骤与图解 1.构建步骤 2.图解 三.代码实现 1.创建节点类: 2.创建霍夫曼 ...
- 深入学习二叉树(三) 霍夫曼树
深入学习二叉树(三) 霍夫曼树 1 前言 霍夫曼树是二叉树的一种特殊形式,又称为最优二叉树,其主要作用在于数据压缩和编码长度的优化. 2 重要概念 2.1 路径和路径长度 在一棵树中,从一个结点往下可 ...
- 数据结构c语言版胡学刚答案,哈夫曼树的建立与实现(最终版)最新版
<哈夫曼树的建立与实现.doc>由会员分享,可免费在线阅读全文,更多与<哈夫曼树的建立与实现(最终版)>相关文档资源请在帮帮文库(www.woc88.com)数亿文档库存里搜索 ...
- c语言霍夫曼函数,使用C语言详解霍夫曼树数据结构
1.基本概念 a.路径和路径长度 若在一棵树中存在着一个结点序列 k1,k2,--,kj, 使得 ki是ki+1 的双亲(1<=i 从 k1 到 kj 所经过的分支数称为这两点之间的路径长度,它 ...
- 数据结构与算法 / 霍夫曼树、霍夫曼编码和解码
一. 诞生原因 找出存放一串字符所需的最少的二进制编码. 二. 构造方法 首先统计出每种字符出现的频率,即:概率.权值. 例如:频率表 A:60, B:45, C:13 D:69 E ...
- 数据结构(十二) -- 树(四) -- 霍夫曼树
1. 基本介绍 给定n个权值为n个叶子节点,构造一棵二叉树,若该树的带权路径长度(wpl)达到最小,称这样的二叉树为最优二叉树,也成为了霍夫曼树. 霍夫曼树是带权路径长度最短的树,权值较大的节点离根较 ...
最新文章
- 查看回调几个选项含义_C 盘总是莫名变大?更改这个文件位置至少腾出几个 G !...
- 常用脚本--查看数据库文件大小
- websocket实现单聊
- 设python中有模块m_Python 模块
- 针对IE的CSS hack 全面 实用
- 五个最佳编程文本编辑器
- 自动格式化SQL工具推荐
- cad解除块的快捷命令_47个快捷键50个CAD技巧,快收藏起来
- hfs网络文件服务器如何设置,hfs网络文件服务器的教程
- Linux期末复习第三章
- 通过修改注册表打开或关闭Windows防火墙端口
- 7-4 出圈游戏 (c 语言)PTA
- 和开源硬件相关的几个词,免费、山寨、创客教育,以及未来 | COSCon'18
- 定义一个方法,使用随机的字母+数字生成一个6位数的密码
- 仓库设计之ER图箭头讲解
- 基于PHP美食食谱的外文翻译,中国传统菜谱的英文翻译锦集
- ISO 26262系列文章之————5 硬件开发
- Python_楼梯数计算
- 【蓝桥杯冲刺 day23】第二点五个不高兴的小明 --- O(n^2)优化思路
- 字节Java高工面试:java时间戳是毫秒还是秒