数据结构之二叉树

什么是树?

树是一种一对多的数据结构。树有很多子集,比如:二叉树、完全二叉树、满二叉树、二叉搜索树等等。

树的特征:

  1. 没有父结点的叫做根,一个树有且只有一个根;
  2. 每个结点有0个或者多个子结点;
  3. 一棵树可以拥有子树,且不能相交;

树的案例:

什么是度:

每个结点拥有的子结点数量称为该结点的度。如上图D的结点度为3,度为0的结点称为叶结点,也就是没有子结点的结点。

树的深度

树中结点最大层次树称为树的深度或高度。

二叉树

二叉树是一种特殊的树,二叉树的特征:

  1. 每个结点最多有2个子结点的树,也就是不存在度大于2的情况
  2. 左右子树有一定的顺序(比如升序和降序),次序不能颠倒
  3. 即使树中某结点只有一棵子树,也要区分它是左子树还是右子树

二叉树性质:

  1. 在二叉树的第i层上最对有2^-1个节点,(i >= 1)
  2. 二叉树中如果深度为k,那么最多有2^k-1个节点,(k >=1)
  3. n0 = n2 + 1;n0表示度数为0的节点数(就是没有子节点的结点,可以理解成叶结点),n2表示度数为2的节点数。
  4. 在完全二叉树中,具有n个节点的完全二叉树深度为【log2n】+1,其中【log2n】是向下取整的
  5. 若对含n个结点的完全二叉树从上到下从左到右进行1至n的编号,则对完全二叉树中任意一个编号为i的结点有以下特征:
  1. 若i=1;则该结点是二叉树的根,无双亲;否则,编号为【i/2】的结点为其双亲结点;
  2. 若2i>n;则该结点无左孩子,否则编号2i的结点为左孩子结点
  3. 若2i + 1 > n;则该结点无右孩子,否则2i+1的结点为右孩子结点

满二叉树:

在一棵二叉树中,如果所有分支结点都存在左子树和右子树,并且所有叶子都在同一层上,这样的二叉树称为满二叉树。

也是所有非叶结点的子结点个数都为2,看起来呈水平对称。

特点:

  1. 叶子结点只能出现在最下面一层
  2. 非叶结点的度一定是2
  3. 在同样深度的二叉树中,满二叉树的结点个数最多,叶子树最多

完全二叉树:

特征:

  1. 该树非最后一层的结点都是满的
  2. 最后一层的叶结点必须集中在左边,也就是不允许倒数第二层的结点只有右子结点而没有左子结点
  3. 同样结点数目的二叉树,完全二叉树深度最小

满二叉树一定是完全二叉树,但完全二叉树不一定是满二叉树

二叉树的存储结构

  1. 顺序存储

二叉树的顺序存储结构就是使用一维数组存储二叉树中的结点,并且结点的存储位置就是数组下表索引。

采用顺序存储,是合理的

当二叉树不为完全二叉树时

顺序存储结构图

其中^表示此位置没有存储结点,已经出现了空间浪费

因此:顺序存储一般适用于完全二叉树

2.二叉链表

既然顺序存储不能满足二叉树的存储要求,那么考虑采用链式存储,有二叉树的定义而知,二叉树的每个结点最多有两个子结点,因此可以将结点数据结构定义成一个数据和两个指针域。

图示:

Lchild(左孩子指针)

Data(数据域)

Rchild(右孩子指针)

链表结构存储二叉树,称为二叉链表

二叉树遍历

二叉树遍历指从二叉树的根结点出发,按照某种次序访问二叉树中的所有结点,使得每个结点都被访问一次,且仅被访问一次。

访问次序可以分为四种:

  1. 前序遍历

从根结点出发,当第一次到达结点就输出结点数据,按照先左再右的方向访问

如图:

执行步骤:

从根结点,第一次到达A,输出A

继续向左,到达B,输出B

同样规则输出D、H

当到达叶结点H,返回D,此时已经第二次到达D,不再输出,开始向D右子树访问,不为空,访问到I,输出I

I为叶结点返回D,D的左右子结点访问完毕,返回到B,B右子树不为空,访问到E,输出E,依次类推

最终输出:ABDHIEJCFG

  1. 中序遍历

从根结点出发,每二次到达结点时就输出结点数据,按照先左后右

最终输出:HDIBJEAFCG

  1. 后序遍历

从二叉树根结点出发,每三次到达的结点时就输出该结点数据,按照先左后右

最终输出:HIDJEBFGCA

  1. 层次遍历

按照树的层次自上而下的遍历二叉树

最终输出:ABCDEFGHIJ

二叉树之霍夫曼树

霍夫曼树是二叉树的一种特殊方式,又称最优二叉树,其主要作用在于数据压缩和编码长度的优化。

  1. 路径和路径长度

路径:从一棵树中,从一个结点往下可以到达孩子或者孙子结点之间的通路叫做路径,通路中分支的数目称为路径长度。若规定根结点的层数为1,则从根结点到第L层结点的路径长度为L-1

A到D路径长度为2,A到C路径长度为1

  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树为一棵霍夫曼树。

二叉排序树

二叉排序树又称二叉查找树,也称二叉搜索树。

二叉排序树或者是一棵空树,或者是具有下列性质的二叉树:

  1. 若左子树不能空,则左子树上所有结点的值均小于或等于它的根结点的值
  2. 若右子树不能空,则左子树上所有结点的值均大于或等于它的根结点的值
  3. 左右子树也分别为二叉排序树

例子:

现有序列:61 87 59 47 35 73 51 98 37 93

索引 i = 0,A[i] = 61,结点61作为根结点

数据结构之二叉树,二叉树存储结构,二叉树遍历,霍夫曼树以及图解相关推荐

  1. 数据结构(二叉树相关、满、完全二叉树、霍夫曼树、排序方法及时间复杂度总结、)笔记-day11

    目录 前言 一.树(Tree) 1.1树及特征 1.2二叉树概念及性质 1.3二叉树存储结构及遍历 1.4链式存储编码 二.霍夫曼树(最优二叉树) 2.1权值及带权路径长度 2.2霍夫曼树特征及构建 ...

  2. 数据结构与算法之Huffman tree(赫夫曼树 / 霍夫曼树 / 哈夫曼树 / 最优二叉树)

    目录 赫夫曼树概述 定义 构造赫夫曼树步骤 代码实现 赫夫曼树概述 HuffmanTree因为翻译不同所以有其他的名字:赫夫曼树.霍夫曼树.哈夫曼树 赫夫曼树又称最优二叉树,是一种带权路径长度最短的二 ...

  3. 二叉树合集(二):霍夫曼树(图文详解)

    合集地址 二叉树合集(一):二叉树基础(含四种遍历,图文详解) 二叉树合集(二):霍夫曼树(图文详解) 二叉树合集(三):线索二叉树(图文详解) 二叉树合集(四):对称二叉树(递归和迭代实现) 二叉树 ...

  4. 霍夫曼树(最优二叉树)的实现

    文章目录 一.相关概念 1.节点的路径及路径长度 2.节点的带权路径长度 3.树的带权路径长度 4.霍夫曼树 二.构建步骤与图解 1.构建步骤 2.图解 三.代码实现 1.创建节点类: 2.创建霍夫曼 ...

  5. 深入学习二叉树(三) 霍夫曼树

    深入学习二叉树(三) 霍夫曼树 1 前言 霍夫曼树是二叉树的一种特殊形式,又称为最优二叉树,其主要作用在于数据压缩和编码长度的优化. 2 重要概念 2.1 路径和路径长度 在一棵树中,从一个结点往下可 ...

  6. 数据结构c语言版胡学刚答案,哈夫曼树的建立与实现(最终版)最新版

    <哈夫曼树的建立与实现.doc>由会员分享,可免费在线阅读全文,更多与<哈夫曼树的建立与实现(最终版)>相关文档资源请在帮帮文库(www.woc88.com)数亿文档库存里搜索 ...

  7. c语言霍夫曼函数,使用C语言详解霍夫曼树数据结构

    1.基本概念 a.路径和路径长度 若在一棵树中存在着一个结点序列 k1,k2,--,kj, 使得 ki是ki+1 的双亲(1<=i 从 k1 到 kj 所经过的分支数称为这两点之间的路径长度,它 ...

  8. 数据结构与算法 / 霍夫曼树、霍夫曼编码和解码

    一. 诞生原因 找出存放一串字符所需的最少的二进制编码. 二. 构造方法 首先统计出每种字符出现的频率,即:概率.权值. 例如:频率表 A:60,    B:45,   C:13   D:69   E ...

  9. 数据结构(十二) -- 树(四) -- 霍夫曼树

    1. 基本介绍 给定n个权值为n个叶子节点,构造一棵二叉树,若该树的带权路径长度(wpl)达到最小,称这样的二叉树为最优二叉树,也成为了霍夫曼树. 霍夫曼树是带权路径长度最短的树,权值较大的节点离根较 ...

最新文章

  1. 查看回调几个选项含义_C 盘总是莫名变大?更改这个文件位置至少腾出几个 G !...
  2. 常用脚本--查看数据库文件大小
  3. websocket实现单聊
  4. 设python中有模块m_Python 模块
  5. 针对IE的CSS hack 全面 实用
  6. 五个最佳编程文本编辑器
  7. 自动格式化SQL工具推荐
  8. cad解除块的快捷命令_47个快捷键50个CAD技巧,快收藏起来
  9. hfs网络文件服务器如何设置,hfs网络文件服务器的教程
  10. Linux期末复习第三章
  11. 通过修改注册表打开或关闭Windows防火墙端口
  12. 7-4 出圈游戏 (c 语言)PTA
  13. 和开源硬件相关的几个词,免费、山寨、创客教育,以及未来 | COSCon'18
  14. 定义一个方法,使用随机的字母+数字生成一个6位数的密码
  15. 仓库设计之ER图箭头讲解
  16. 基于PHP美食食谱的外文翻译,中国传统菜谱的英文翻译锦集
  17. ISO 26262系列文章之————5 硬件开发
  18. Python_楼梯数计算
  19. 【蓝桥杯冲刺 day23】第二点五个不高兴的小明 --- O(n^2)优化思路
  20. 字节Java高工面试:java时间戳是毫秒还是秒

热门文章

  1. Android 8 的HIDL 学习 之 Code demo
  2. 第十一章 C++ 封装/继承/多态
  3. 一命二运三风水,四积功德五读书,六择业七择偶,八交贵人,九养生
  4. 用户体验设计笔记(1-1)
  5. 文心一言,站在奥林匹亚
  6. 什么 APP 能在 3 个月内有 1000 万用户?
  7. 练习:柱状图中最大矩形
  8. 如何利用支付宝集福(敬业福)引流
  9. java vector addall_Java Vector addAll()用法及代码示例
  10. 实施交付项目经理的记录-金融版