一、定义:树是一个n(n>=0)个结点的有序合集

结点:指树中的一个元素;
结点的度:指结点拥有的子树的个数,二叉树的度不大于2;
树的度:指树中的最大结点度数;
叶子:度为0的结点,也称为终端结点;
高度:叶子节点的高度为1,根节点高度最高;
层:根在第一层,以此类推; 层和高度相对而言,层从上往下,高度从下往上
节点n的高度:n节点到叶子节点所有路径上包含节点个数的最大值。叶子节点的高度为1,往上节点的高度依次递增。
节点n的深度:从根节点到节点n唯一的路径的长,根节点深度为1
树中节点的最大层数称之为树的深度或者高度,所以在基数为1时树的深度=树的高度=最大层数
基数从1或从0算起都没错,条件变化而已

二、二叉树
1、二叉树的定义:由一个结点和两颗互不相交、分别称为这个根的左子树和右子树的二叉树构成(递归定义)
所谓二叉树,一个节点分带有左右子树
2、二叉树的性质:
1:二叉树的第i层上至多有2^(i-1)个结点 满二叉树
2:深度为k的二叉树,至多有2^k-1个结点 前n项和公式
二叉树的算法实现
  private static class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
深度优先搜索(DFS)与广度优先搜索(BFS)
实现:dfs=栈,压栈,出栈一次访问多条路径;bfs=队列,入队出队,一次访问一条路径;
关系:用DFS解决的问题都可以用BFS解决。DFS易于编写(递归),时间消耗较少但是容易发生爆栈,而BFS可以控制队列的长度。
3、满二叉树:叶子节点一定要在最后一层,并且所有非叶子节点都存在左子树和右子树;
就是那种比较对称和好看的二叉树
完全二叉树:从左到右、从上到下构建的二叉树;
一种不满的二叉树,优先从左向右排列

完全二叉树的性质:
1:结点 i 的子结点为2i 和 2i+1(前提是都小于总结点数)
2:结点 i 的父结点为 i/2

4、二叉树的遍历(要有递归的思想):
1:先序遍历:根->左子树->右子树(先序) 根左右 ABDGCEFH
2:中序遍历:左子树->根->右子树(中序) 左根右 DGBAECHF
3:后序遍历:左子树->右子树->根(后序) 左右根 GDBEHFCA
注意每次递归时都要如此判断顺序

这三种遍历方法只是访问结点的时机不同,访问结点的路径都是一样的,时间和空间复杂度皆为O(n)

5、二叉树的存储结构:
1:顺序存储(只适用于完全二叉树)——可以用于排序算法中的堆排序
用数组的索引从上到下,从左到右排序

2:链式存储(最普遍的存储方式)——由于结点可能为空,所以会比较浪费空间
如果有n个节点,则有2n个left、right指针,但是用到的只有n-1个指针

3:线索存储(改进的方法)

4:关于霍(哈)夫曼编码(Huffman编码):
      Huffman是一种前缀编码;Huffman编码是建立在Huffman树的基础上进行的,因此为了进行Huffman编码,必须先构建Huffman树;
① 树的路径长度是每个叶节点到根节点的路径之和; 从末端到根部的长度
② 带权路径长度是(每个叶节点的路径长度wi)之和; 每个权值路径长度 再求和
③ Huffman树是最小带权路径长度的二叉树;

构造Huffman树的过程:
(1)将各个节点按照权重从小到大排序; 按照权重排序
(2)取最小权重的两个节点,并新建一个父节点作为这两个节点的双亲,双亲节点的权重为子节点权重之和,再将此父节点放入原来的队列;
找小的两个来个父,权值为其和,继续找小的来个父。。。。。直到只剩一个节点
(3)重复(2)的步骤,直到队列中只有一个节点,此节点为根节点;

构造完Huffman树之后,就可以进行Huffman编码了,编码规则:左分支填0,右分支填1;

Huffman解码过程:给定一个01串,将01串进行Huffman树,到叶子节点了就表明已经解码一个节点,然后再次遍历Huffman树;

5、动态查找树
1.二叉查找树,二叉搜索树,有序二叉树,排序二叉树
④ 若任意节点的左子树不空,则左子树上所有节点的值均小于它的根节点的值;
⑤ 若任意节点的右子树不空,则右子树上所有节点的值均大于它的根节点的值;
⑥ 任意节点的左、右子树也分别为二叉查找树;
⑦ 没有键值相等的节点。
左<根<右
二叉查找树相比于其他数据结构的优势在于查找、插入的时间复杂度较低为O ( log n )。
二叉查找树是基础性数据结构,用于构建更为抽象的数据结构,如集合、多重集、关联数组
2.平衡二叉树(AVL树)
平衡二叉树:当且仅当任何节点的两棵子树的高度差不大于1的二叉树;

其中AVL树是最先发明的自平衡二叉查找树,是最原始典型的平衡二叉树。

平衡二叉树是基于二叉查找树的改进。由于在某些极端的情况下(如在插入的序列是有序的时),二叉查找树将退化成近似链或链,此时,其操作的时间复杂度将退化成线性的,即O(n)。所以我们通过自平衡操作(即旋转)构建两个子树高度差不超过1的平衡二叉树。

3.红黑树
红黑树也是一种自平衡的二叉查找树。
1.每个结点要么是红的要么是黑的。(红或黑)
2.根结点是黑的。  (根黑)
3.每个叶结点(叶结点即指树尾端NIL指针或NULL结点)都是黑的。  (叶黑)
4.如果一个结点是红的,那么它的两个儿子都是黑的。  (红子黑)
5.对于任意结点而言,其到叶结点树尾端NIL指针的每条路径都包含相同数目的黑结点。(路径下黑相同)
如图就是一棵典型的红黑树。保证红黑树满足它的基本性质,就是在调整数据结构自平衡。
而红黑树自平衡的调整操作方式就有旋转和变色两种。
红黑树是一种应用很广的数据结构,如在Java集合类中TreeSet和TreeMap的底层,C++STL中set与map,以及linux中虚拟内存的管理。

3.多路查找树
大规模数据存储中,实现索引查询这样一个实际背景下,树节点存储的元素数量是有限的(如果元素数量非常多的话,查找就退化成节点内部的线性查找了),这样导致二叉查找树结构由于树的深度过大而造成磁盘I/O读写过于频繁,进而导致查询效率低下。

3.1 B树
B树(英语:B-tree)是一种自平衡的树,能够保持数据有序。这种数据结构能够让查找数据、顺序访问、插入数据及删除的动作,都在对数时间内完成。B树,概括来说是一个一般化的二叉查找树(binary search tree),可以拥有最多2个子节点。与自平衡二叉查找树不同,B树适用于读写相对大的数据块的存储系统,例如磁盘。

1.根结点至少有两个子女。 符合二叉
2.每个中间节点都包含k-1个元素和k个孩子,其中 m/2 <= k <= m
3.每一个叶子节点都包含k-1个元素,其中 m/2 <= k <= m
4.所有的叶子结点都位于同一层。
5.每个节点中的元素从小到大排列,节点当中k-1个元素正好是k个孩子包含的元素的值域分划。

如图所示就是一颗符合规范的B树,由于相比于磁盘IO的速度,内存中的耗时几乎可以省略,所以只要树的高度足够低,IO次数足够小,就可以提升查询性能。

B树的增加删除同样遵循自平衡的性质,有旋转和换位。

B树的应用是文件系统及部分非关系型数据库索引。

3.2 B+树
B+ 树是一种树数据结构,通常用于关系型数据库(如Mysql)和操作系统的文件系统中。B+ 树的特点是能够保持数据稳定有序,其插入与修改拥有较稳定的
对数时间复杂度。B+ 树元素自底向上插入,这与二叉树恰好相反。

在B树基础上,为叶子结点增加链表指针(B树+叶子有序链表),所有关键字都在叶子结点中出现,非叶子结点作为叶子结点的索引;B+树总是到叶子结点才命中。

b+树的非叶子节点不保存数据,只保存子树的临界值(最大或者最小),所以同样大小的节点,b+树相对于b树能够有更多的分支,使得这棵树更加矮胖,查询时做的IO操作次数也更少。
这通常在多数节点在次级存储比如硬盘中的时候出现。通过最大化在每个内部节点内的子节点的数目减少树的高度,平衡操作不经常发生,而且效率增加了。

3.3 B*树

B*树是B+树的变体,在B+树的非根和非叶子结点再增加指向兄弟的指针
在B+树基础上,为非叶子结点也增加链表指针,将结点的最低利用率从1/2提高到2/3。

3.4 R树
R树是用来做空间数据存储的树状数据结构。例如给地理位置,矩形和多边形这类多维数据建立索引。

R树的核心思想是聚合距离相近的节点并在树结构的上一层将其表示为这些节点的最小外接矩形(MBR),这个最小外接矩形就成为上一层的一个节点。因为所有节点都在它们的最小外接矩形中,所以跟某个矩形不相交的查询就一定跟这个矩形中的所有节点都不相交。叶子节点上的每个矩形都代表一个对象,节点都是对象的聚合,并且越往上层聚合的对象就越多。也可以把每一层看做是对数据集的近似,叶子节点层是最细粒度的近似,与数据集相似度100%,越往上层越粗糙。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值