天天看点

树总结一、二叉树二、动态查找树三、多路查找树

什么是树?为什么要有树?

个人理解:树就是带有一定层次结构的抽象数据类型。因为将数据分成有层次类型之后,在管理和查找操作上就更有效率。

树总结一、二叉树二、动态查找树三、多路查找树

一、二叉树

二叉树:每个节点最多含有两个子树的树称为二叉树。

满二叉树:除最后一层无任何子节点外,每一层上的所有结点都有两个子结点。也可以这样理解,除叶子结点外的所有结点均有两个子结点。节点数达到最大值,所有叶子结点必须在同一层上

完全二叉树:若设二叉树的深度为h,除第 h 层外,其它各层 (1~(h-1)层) 的结点数都达到最大个数,第h层所有的结点都连续集中在最左边,这就是完全二叉树。

注:完全二叉树是效率很高的数据结构,堆是一种完全二叉树或者近似完全二叉树,所以效率极高,像十分常用的排序算法、Dijkstra算法、Prim算法等都要用堆才能优化,二叉排序树的效率也要借助平衡性来提高,而平衡性基于完全二叉树。

二叉树的三种遍历方式:

先序遍历:先根节点->遍历左子树->遍历右子树

中序遍历:遍历左子树->根节点->遍历右子树

后序遍历:遍历左子树->遍历右子树->根节点

二、动态查找树

2.1 二叉查找树

二叉查找树定义:又称为是二叉排序树(Binary Sort Tree)或二叉搜索树。二叉排序树或者是一棵空树,或者是具有下列性质的

1) 若左子树不空,则左子树上所有结点的值均小于它的根结点的值;

2) 若右子树不空,则右子树上所有结点的值均大于或等于它的根结点的值;

3) 左、右子树也分别为二叉排序树;

4) 没有键值相等的节点。

个人理解:整个树结构的层次关系不是乱的,而是通过有效的排序,这样大大提升了查找效率。

2.2平衡二叉树(AVL)

因为我们在二叉树中不停地插入元素后,可能就会导致左边或右边某一边子树特别多,这样的不平衡就会大大降低了二叉树的查找效率,所以引入了平衡二叉树。

平衡二叉树定义:平衡二叉树(Balanced Binary Tree)又被称为AVL树(有别于AVL算法),且具有以下性质:它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。这个方案很好的解决了二叉查找树退化成链表的问题,把插入,查找,删除的时间复杂度最好情况和最坏情况都维持在O(logN)。但是频繁旋转会使插入和删除牺牲掉O(logN)左右的时间,不过相对二叉查找树来说,时间上稳定了很多。

树总结一、二叉树二、动态查找树三、多路查找树

2.2.1平衡二叉树的调整

平衡因子:BF(Balance Factor) BF(T) = hL-hR(hL、hR分别代表左右子树的高度)

树总结一、二叉树二、动态查找树三、多路查找树
树总结一、二叉树二、动态查找树三、多路查找树
树总结一、二叉树二、动态查找树三、多路查找树
树总结一、二叉树二、动态查找树三、多路查找树

2.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个孩子包含的元素的值域分划。

树总结一、二叉树二、动态查找树三、多路查找树

个人理解:相当于降低树的高度,并且将同一层的结点合并,这样就避免了同一层中结点数过多,查找变成了线性查找,提升查询效率。

继续阅读