红黑树--基本概念

1.java中的TreeSet,TreeMap底层使用了红黑树
2.红黑树的定义
enum Color {
RED = 0;
BLACK = 1;
}
struct RBTreeNode{
struct RBTreeNode *left,*right,*parent;
int key;
int data;
Color color;
}
3.红黑树有哪些性质?
1.每个结点要么是红的,要么是黑的。
2.根节点是黑色的。
3.每个叶子节点(叶子结点即树尾端null指针或者null结点)是黑色的。
4.如果某个结点是红色的,那么它的两个子节点是黑色的。
5.对于任一结点而言,其到叶子结点null指针的每一条路径都包含相同数目的黑色结点。
4.红黑树的各种操作的时间复杂度是多少?
能保证在最坏的情况下,基本的CRUD操作时间复杂度都是O(logN);
5.红黑树相比较二分查找树(BST)和AVL树(平衡二叉树)各有什么优点?
红黑树是牺牲了严格的高度平衡的优越条件作为代价,它只要求达到部分的平衡,降低了对于旋转所需的要求
从而提高了性能,红黑树能够在O(log2N)的时间复杂度进行搜索、插入、删除操作。此外,由于红黑树的设计
任何不平衡都会在三次旋转之内得以解决。
相比较BST(二分查找树),红黑树可以确保树的最长路径不大于两倍的最短路径(max<=2*min),所以他在
查找效果上还是有最低保障的,在最坏的情况下也可以保证O(logN)的,这是要优于二叉查找树的,因为BST
最坏的情况可以让查找达到O(N),树的一边倒相当于遍历了整个BST。
红黑树的算法时间复杂度和AVL树(平衡二叉树)相同,但是统计性能比AVL树要高,所以在插入和删除中所做的
后期维护操作肯定会比红黑树耗时很多,但是红黑树和AVL树的查找效率都是O(logN),所以红黑树的应用还是高
于AVL树的,实质上插入到AVL树和插入到红黑树的速度取决于你所插入的数据,如果你的数据分布较好,则比较
适合于AVL树,但是如果处理比较杂乱的情况,则红黑树是比较快的。
6.红黑树相对于哈希表,在选择使用的时候有什么依据?
权衡四个因素:查找速度、数据量、内存使用,可扩展性
总体来说:hash查找速度会比map快,而且查找速度和数据量的大小无关,属于常数级别。而map的查找速度是
O(logN)级别的,并且不一定常数就比O(logN)小,hash还有hash函数的耗时,如果考虑效率,特别是当
元素在到达一定的级别时,考虑hash。如果对于内存的要求特别严格,希望程序能够尽量少消耗内存;特别是当
hash对象特别多的时候,内存不可控,并且此时的hash构造的速度较慢。

特性:假设一颗红黑树上从跟到叶子节点的最短路径全部是由黑色结点构成的,而最长结点则由红黑结点交错
构成,又因为最短路径和最长路径的黑色结点数目是一致的,所以最长路径上的节点数目最多时最短路径的两倍
自平衡策略:
左旋转、右旋转、变色
左旋转:当前结点的右子结点为红色,左子结点为黑色,则执行左旋转。
右旋转:当前结点的左子、左孙子结点均为红色,则进行右旋转。
变色:当前结点的左、右结点均为红色,则将其全部进行变色。
插入操作:
红黑树作为平衡二叉树的一种,同样需要借助于查找操作定位到插入点,不过红黑树规定:新插入的结点
一律为红色,主要是为了简化树的自平衡过程,对于一棵空的树,插入结点为红色会增加一次变色操作,
但是其他的情况,如果插入的结点是一个黑色结点,那么会破坏红黑树结构,此时可以通过简单的策略对
树进行调整以重新满足定义。
删除操作:
红黑树作为平衡二叉树的一种,同时需要借助于查找操作定位删除点,再执行删除操作之前我们需要判断
删除结点有几个孩子结点,若果有两个子节点的话,我们需要从结点的左子树中寻找最大值的结点,或者
从右子树中寻找最小的结点,并用结点值替换掉待删除结点(只要是目标结点值从树上消失即可)。这两个
结点有一个共性,即最多只有一个孩子结点(因为自己所处的范围已经是最大或者最小了),此时就将需求
转变为删除只有一个孩子的结点。
总结:
红黑树的主要难点在于插入和删除的过程中的自平衡调整,插入过程红黑树的自平衡调整相对简单点,
删除过程需要的处理就会多一点。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值