数据结构树

一些定义

树:
一棵树t是一个非空的有限元素的集合,其中一个元素为根,其余的元素(如果有的话)组成t的子树。
一棵树的高度或深度是树中级的个数。
一个元素的度是指其孩子的个数。叶子节点的个数为0.一棵树的度是其元素的度的最大值。

二叉树:
一棵二叉树有n个元素,n>0,它有n-1条边。
一棵二叉树的高度为h,h大于等于0,则他最少有h个元素,最多有2^h-1个元素。
一棵二叉树有n个元素,n>0,它的最大高度为n,最小高度为log2(n+1);

满二叉树:
当高度为h的二叉树恰好友2^h-1个元素时,称其为满二叉树。

完全二叉树:
一棵深度为k的有n个结点的二叉树,对树中的结点按从上至下、从左到右的顺序进行编号,如果编号为i(1≤i≤n)的结点与满二叉树中编号为i的结点在二叉树中的位置相同,则这棵二叉树称为完全二叉树。
若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。

二叉查找树(BST):
二叉排序树(Binary Sort Tree),又称二叉查找树(Binary Search Tree),亦称二叉搜索树。是数据结构中的一类。在一般情况下,查询效率比链表结构要高。
定义:
一棵空树,或者是具有下列性质的二叉树:
性质1:若左子树不空,则左子树上所有结点的值均小于它的根结点的值;
性质2:若右子树不空,则右子树上所有结点的值均大于它的根结点的值;
性质3:左、右子树也分别为二叉排序树;
性质4:没有键值相等的结点。

平衡二叉树(avl树)
 AVL树本质还是一棵二叉查找树,只是在其基础上增加了“平衡”的要求。所谓平衡是指,对AVL树的任意结点来说,其左子树与右子树的高度之差的绝对值不超过1,其中左子树与右子树的高度因子之差称为平衡因子。
 平衡二叉树要求对于每一个节点来说,它的左右子树的高度之差不能超过1,如果插入或者删除一个节点使得高度之差大于1就要进行节点之间的旋转,将二叉树重新维持在一个平衡状态。这个方案很好的解决了二叉查找树退化成链表的问题,把插入,查找,删除的时间复杂度最好情况和最坏情况都维持在O(logn)时间时间。但是频繁旋转会使插入和删除牺牲掉O(logN)的的左右的时间,不过相对二叉查找树来说,时间上稳定了很多。

B树
 B 树又叫平衡多路查找树。它的每一个节点最多包含m个孩子,m便称为B树的阶。k的大小取决于磁盘页的大小。
  b树(balance tree)和b+树应用在数据库索引,可以认为是m叉的多路平衡查找树,但是从理论上讲,二叉树查找速度和比较次数都是最小的,为什么不用二叉树呢?
因为我们要考虑磁盘IO的影响,它相对于内存来说是很慢的。数据库索引是存储在磁盘上的,当数据量大时,就不能把整个索引全部加载到内存了,只能逐一加载每一个磁盘页(对应索引树的节点)。所以我们要减少IO次数,对于树来说,IO次数就是树的高度,而“矮胖”就是b树的特征之一,它的每个节点最多包含m个孩子,m称为b树的阶,m的大小取决于磁盘页的大小。

红黑树:
一种二叉查找树,但在每个节点增加一个存储位表示结点的颜色,可以是红或黑(非红即黑)。通过对任何一条从根到叶子的路径上各个节点着色的方式的限制,红黑树确保没有一条路径会比其他路径长出两倍,因此,红黑树是一种弱平衡二叉树(由于是弱平衡,可以看到,在相同的节点情况下,AVL树的高度低于红黑树),相对于要求严格的AVL树来说,它的旋转次数少,插入最多两次旋转,删除最多三次旋转,所以对于搜索,插入,删除操作较多的情况下,我们就用红黑树。
它必须满足下面性质:
性质1:每个节点要么是黑色,要么是红色。
性质2:根节点是黑色。
性质3:每个叶子节点(NIL)是黑色。
性质4:每个红色结点的两个子结点一定都是黑色。
性质5:任意一结点到每个叶子结点的路径都包含数量相同的黑结点。

a、红黑树(Red Black Tree) 是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组
b、由于它的设计,任何不平衡都会在三次旋转之内解决。红黑树是用空间换时间,空间复杂度O(logn)
c、相比于BST,因为红黑树可以能确保树的最长路径不大于两倍的最短路径的长度,所以可以看出它的查找效果是有最低保证的。在最坏的情况下也可以保证O(logN)的,这是要好于二叉查找树的。因为二叉查找树最坏情况可以让查找达到O(N)。

AVL和红黑树比较

1.红黑树并不追求“完全的平衡”,它只要求达到部分的平衡,降低了对旋转的要求,从而提高了性能。
2.红黑树能够以O(log2 n)的时间复杂度进行搜索、插入、删除操作,由于它的设计,任何不平衡都会在三次旋转之内解决。还有一些更好的,但实现起来更复杂的数据结构能够做到一步旋转之内达到平衡,但红黑树能够给我们一个比较“便宜”的解决方案。
3.红黑树的算法时间复杂度和AVL相同,但统计性能比AVL树更高
4.红黑树的插入效率更高
5.红黑树的平衡要求不如AVL树严格,理论上search要慢些,实际也如此,不过差距并不大
6.因为AVL树和红黑树都属于二叉查找树,所以是有序的。

总结:
 红黑树的查询性能略微逊色于AVL树,因为他比avl树会稍微不平衡最多一层,也就是说红黑树的查询性能只比相同内容的avl树最多多一次比较,但是,红黑树在插入和删除上完爆avl树,avl树每次插入删除会进行大量的平衡度计算,而红黑树为了维持红黑性质所做的红黑变换和旋转的开销,相较于avl树为了维持平衡的开销要小得多
 AVL树适合用于插入与删除次数比较少,但查找多的情况;相对于要求严格的AVL树来说,红黑树的旋转次数少,所以对于搜索、插入、删除操作较多的情况下,我们就用红黑树。
window对进程地址空间的管理用到了AVL树。红黑树广泛应用于C++的STL中,set、multiset、map、multimap;Linux虚拟内存的管理,以及Java的TreeMap和TreeSet都是通过红黑树去实现的

红黑树相对于哈希表,在选择使用的时候有什么依据?

 权衡三个因素: 查找速度, 数据量, 内存使用,可扩展性。
 总体来说,hash查找速度会比map快,而且查找速度基本和数据量大小无关,属于常数级别;而map的查找速度是log(n)级别。并不一定常数就比log(n) 小,hash还有hash函数的耗时,明白了吧,如果你考虑效率,特别是在元素达到一定数量级时,考虑考虑hash。但若你对内存使用特别严格, 希望程序尽可能少消耗内存,那么一定要小心,hash可能会让你陷入尴尬,特别是当你的hash对象特别多时,你就更无法控制了,而且 hash的构造速度较慢。
 红黑树并不适应所有应用树的领域。如果数据基本上是静态的,那么让他们待在他们能够插入,并且不影响平衡的地方会具有更好的性能。如果数据完全是静态的,例如,做一个哈希表,性能可能会更好一些。
 在实际的系统中,例如,需要使用动态规则的防火墙系统,使用红黑树而不是散列表被实践证明具有更好的伸缩性。Linux内核在管理vm_area_struct时就是采用了红黑树来维护内存块的。
 STL::map是基于红黑树的。C++ 11标准中加入了unordered系列的容器。unorered系列容器是基于哈希的。

时间复杂度

二叉查找树。算法的性能取决于树的形状,而树的形状取决于插入键的顺序。在最好的情况下,n个结点的树是完全平衡的,如下图“最好情况”所示,此时树的高度为⌊log2 n⌋ + 1,所以时间复杂度为O(lg n)当我们将键以升序或者降序插入的时候,得到的是一棵斜树,如下图中的“最坏情况”,树的高度为n,时间复杂度也变成了O(n)。在最坏情况下,二叉查找树的查找和插入效率很低。为了解决这个问题,引出了平衡二叉树(AVL)。
在这里插入图片描述
此处不再深究直接给出一些结论:

  • AVL和红黑树的时间复杂度都为O(lg n)
  • 插入、查找和删除在平均和最坏情况下的时间复杂度都是O(logn)。
  • 先序遍历:根左右
    中序遍历:左根右
    后续遍历:左右根

一些参考资料

漫画:什么是红黑树
树的前序遍历、中序遍历、后序遍历详解
树的旋转

一些代码

c++实现创建二叉树,然后进行遍历
搜索二叉树的插入,查找,删除

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值