数据结构-树

它是树型结构(非线性结构)结点之间具有分支,具有层次结构

定义:Tree为n(n>=0)个结点的有限集

n=0时为空树,n>0时满足以下两种情况:1.有且仅有一个特定的结点称之为root(根)。

2.其余结点可以分为m个互不香蕉道有限集,称其为子树。

度:结点的分支数,树的度为结点度的最大值。

树的深度为结点的最大层次。

二叉树

二叉树并非树的特殊情况,他们是两种概念,二叉树结点的子树要区分左右子树,就算只有一个子树也要做区分,但是树是不用做区分的。

深度为K的二叉树上的结点至多为2^k-1个结点,最少为k个结点

第i层上最多有2^(i-1)个结点,最少有一个。

满二叉树:从根节点开始,自上而下,自左至右,每个节点都有元素。

完全二叉树:可以与满二叉树一一对应。

遍历

遍历分为先序遍历,中序遍历,后序遍历

他们的遍历流程分别如下:

先序遍历

1.根

2.先序遍历左子树

3.先序遍历右子树

中序遍历

1.中序遍历左子树

2.根

3.中序遍历右子树

后序遍历

1.后序遍历左子树

2.后序遍历右子树

3.根

有一种问题是给你遍历结果问树张什么样子,我们可以从先序遍历的一个结点中得出根,然后到后序遍历中得出左子树,右子树所包含的元素,然后一步步生成它,后续遍历就从最后一个结点得出根。

哈夫曼树

哈夫曼树是最优树

WPL(Weight Path Length)=叶子结点的带权路径长度之和。

哈夫曼树是wpl最短的树

最优二叉树是哈夫曼树的一种,是wpl最小的二叉树,是完全二叉树。

如何生成?

使用贪心算法来看,我们只需要将大的放前面,小的放后面即可。

这样操作:1.选两个最小的生成一个树

2.计算出根值

3.在待选取元素中划去这两个元素

4.选取两个小值重复上面的操作。

哈夫曼编码

左0右1

要看编码的时候,从根结点一路看下来即可。

相关推荐
淡海水7 小时前
08-03-不可变-ImmutableDictionary-TKey-TValue-与ImmutableHashSet-T-持久化哈希树
数据结构·算法·c#·哈希算法·dictionary·immutable
Nil20810 小时前
leetcode 78子集
数据结构·算法·leetcode
喜欢吃燃面11 小时前
深入 C++ STL:从 unordered_set与unordered_map到底层哈希表的原理与实现
数据结构·c++·散列表
en.en..11 小时前
Linux fork() 工作原理
数据结构·算法
不会就选b13 小时前
数据结构之树&&二叉树(二)
数据结构·算法
小刘在重生~15 小时前
Java 集合|Collection、List、ArrayList、LinkedList、泛型、Collections 工具类
java·数据结构·list
我不会起名字32216 小时前
一天一道算法题(29):单调栈
java·数据结构·python·算法·leetcode·golang·单调栈
苦瓜小生16 小时前
【前端】【力扣与手撕】十天带你刷完前端算法与手撕,全是最简单好记的最优解法!day4
前端·数据结构·算法·leetcode·面试
少司府17 小时前
C++进阶:智能指针
开发语言·数据结构·c++·b树·算法·c·智能指针
LuminousCPP18 小时前
数据结构-排序(一):基础排序算法横向对比|冒泡、插入、希尔、堆与双向选择,详解二分 / Knuth 增量
c语言·数据结构·笔记·算法·排序算法