红黑树,对不少童鞋来讲,是既熟悉又陌生。学校中学过,只了解大概;工做中不怎么使用,但面试又是重点。每次须要查看红黑树内容时都很难以更生动形象的方式来理解其内容。没错,本文内容就是要解决这个问题,用简单的语言,搭配静图和动图(利用大脑图形记忆方式),让你对红黑树有更深刻的了解和更清晰的记忆,但愿小伙伴们再次遇到红黑树的问题不至于头大,建议读该文章姿式: 打开两个页面,一个页面看图片和内容,一个页面看公式,像玩魔方同样,多玩几回就明白了git
经过工具 (公众号回复「工具」—>那些能够提升效率的工具—>红黑树) 动态感觉红黑树的转换过程面试
俺家司令买完东西后,我俩常常会发生这样的一段对话:
司令:你猜我买的这个多少钱? 我: 1000 司令: 高了 我: 500 司令: 低了: 我: 750 ...... 直到最后猜中算法
这样说你们应该已经猜到了是「二分查找法」,经过这个例子我想要引出的是 树,来看图片多线程
程序中的树实际上是咱们平常看到的树的倒影,或者发挥一下想象,倒影也能够是树根并发
二叉查找树,Binary Search Tree 「BST」,要想了解二叉查找树,咱们首先看下二叉查找树有哪些特性呢?工具
上图,结合二叉查找树的三条约束来看,很是好,没有什么问题。再来看一个图,依旧符合上面三条约束,感受有问题吗?学习
理科生在高中学习生物时学过一个关键字「去除顶端优点」,经过去除植物顶端优点,侧芽会迅速生长,慢慢变得强壮和平衡, 红黑树其实就是去除二叉查找树顶端优点的解决方案,从而达到树的平衡动画
红黑树,Red-Black Tree 「RBT」是一个自平衡(不是绝对的平衡)的二叉查找树(BST),树上的每一个节点都遵循下面的规则:线程
瞬间懵逼?了解一下印象就行,开始玩魔方都是要照着魔方公式一点点玩的,多玩几回就熟悉了。红黑树也同样,红黑树有两大操做:设计
话很少说,看下图
跟着上面的公式走:
刚刚说了 X 的 uncle 是红色的状况,接下来要说是黑色的状况
这种状况很简单,想象这是一根绳子,手提起 P 节点,而后变色便可
左旋: 使 X 的父节点 P 被 X 取代,同时父节点 P 成为 X 的左孩子,而后再应用 左左状况
与左左状况同样,想象成一根绳子
右旋: 使 X 的父节点 P 被 X 取代,同时父节点 P 成为 X 的右孩子,而后再应用 右右状况
你说的动图在哪里,你个大骗子,别着急,如今就为小伙伴们奉上动图演示,来讲明公式的使用:
插入 10,20,30,15 到一个空树中
向空树中第一次插入数字 10,确定是 root 节点
root 节点标记成黑色
向树中插入新节点 20,标记为红色
20 > 10,并发现 10 没有叶子节点,将新节点 20 做为 10 的右孩子
向树中插入新节点 30,标记为红色
30 > 10,查找 10 的右子树,找到 20
30 > 20,继续查找 20 的右子树,发现 20 没有叶子节点,将值插在此处
30 和 20 节点都为红色,30 为右孩子,20 也为右孩子,触发了 右右状况
经过一次旋转,提起 20 节点
20 节点是根结点,标记为黑色
向树中插入新节点 15,标记为红色
经过比对大小和判断是否有叶子节点,最终插值为 10 节点的右孩子
15 和 10 节点都为红色,15 的 uncle 节点 30 也为红色
按照公式,将 15 的 parent 10 和 uncle 30 更改成黑色
让 15 节点 grand parent 20 的颜色与 15 节点的颜色同样,变为红色
20 为根结点,将其改成黑色
继续插入其余节点只不过反复应用上面的公式,上面应用到的红黑树工具,能够暂停动画效果,一帧一帧的看红黑树的转换过程,这样经过练习,查看公式,观察变化三管齐下,红黑树的入门理解应该彻底再也不是问题了
[center]
欢迎持续关注公众号:「日拱一兵」
- 前沿 Java 技术干货分享
- 高效工具汇总
- 面试问题分析与解答
- 技术资料领取
后续文章会为你讲解各类时间空间复杂度,以及多线程,ElasticSearch 等问题
以读侦探小说思惟轻松趣味学习 Java 技术栈相关知识,本着将复杂问题简单化,抽象问题具体化和图形化原则逐步分解技术问题,技术持续更新,请持续关注......