二叉树

重点

二叉树的用途

二叉树的插入,红黑树的插入。

二叉树的用途

首先二叉树的使用场景基本都是在有序的场景。

比如:在一个大的排序集合里面,查询某个元素是否存在。他的平均查找效率为log2n

相较于有序链表来说,二叉树的插入,查询,删除 效率是相对来说是比较平衡的

一般来说有序二叉树的查询需求是要大于其插入需求。

普通二叉树的插入

首先我们来回顾下顺序二叉树的定义。

1. 所有的左节点的值要小于其右节点的值。

2.所有左子孙节点都要小于其父亲节点。所有右子孙节点都要大于其父亲节点。

2. 有序二叉树不存在相同的值,可以用记录相同的值有几个但不影响其本身数据结构。

3.当N>1时,除根节点以外的其余节点可分为M个互为相交的有限集合T1,T2,...,Tm,其中的每个集合本身又是一棵树,并称其为根的子树(subtree)。(这一点用于我们去插入一个节点,因为子树是不需要关心上层节点的变化)


现在我们来看一下实战环节

现在我们有个一个集合为(9,0,1,3,2,5,4,6,8,7)的一个集合,来看我们一步一步来生成一个普通有序二叉树的过程。

 1.

2.

3. 

                    

4.

增加的原理很简单先比较根节点,如果根节点大于所要插入的数。则跟其左孩子接口点比较,反正跟其右孩子比较,然后重复以上规则,直到其孩子节点为空,则成为其上层节点的孩子节点。

总结:可以看出我们整颗树 构建下来深度比较仓 比如我们要查7从根结点遍历到7,需要整整比较7次,如果我们可能是一个更大的集合,那么它的查找的最大事件复杂度可能会接近o(n) , 所以为了查找树的查找事件复杂度接近log2(n) , 

红黑树的特性


红黑树(自平衡二叉树)是每个节点都带有颜色属性的二叉查找树,颜色或红色或黑色。在二叉查找树强制一般要求以外,对于任何有效的红黑树我们增加了如下的额外要求:

性质1. 节点是红色或黑色。

性质2. 根节点是黑色。

性质3. 每个叶节点(NIL节点,空节点)是黑色的。

性质4. 每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)

性质5. 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。




性质1 保证了可调整中心, 实际上为了维护性质5 , 我们不可能完全构建所有叶子节点到根节点的都含有相同数目的节点

所以退而求次,出现了红色节点来调整平衡。 通过一些系列的旋转来达到目的。

性质2.  根节点是黑色 对应的性质4 红色节点是黑色, 红色作为调整节点, 最终我们还是求得黑色节点作为平衡,所以根节点是黑色没毛病。

性质3.  对应的是性质5和性质1,叶节点为黑色的才能保证我们去调整我们的节点趋于平衡。便于我们调整的时候有回旋的余地。

性质4和性质5 联合起来看才能保证我们树的深度是最短路径距离的一倍。

下面来看看 红黑树的通过数学归纳法来证明

红黑树的时间复杂度为: O(lgn)

下面通过“数学归纳法”对红黑树的时间复杂度进行证明。

定理:一棵含有n个节点的红黑树的高度至多为2log(n+1).

证明:

"一棵含有n个节点的红黑树的高度至多为2log(n+1)" 的逆否命题是 "高度为h的红黑树,它的包含的内节点个数至少为 2h/2-1个"。

我们只需要证明逆否命题,即可证明原命题为真;即只需证明 "高度为h的红黑树,它的包含的内节点个数至少为 2h/2-1个"。

从某个节点x出发(不包括该节点)到达一个叶节点的任意一条路径上,黑色节点的个数称为该节点的黑高度(x's black height),记为bh(x)。关于bh(x)有两点需要说明:

第1点:根据红黑树的"特性(5) ,即从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点"可知,从节点x出发到达的所有的叶节点具有相同数目的黑节点。这也就意味着,bh(x)的值是唯一的

第2点:根据红黑色的"特性(4),即如果一个节点是红色的,则它的子节点必须是黑色的"可知,从节点x出发达到叶节点"所经历的黑节点数目">= "所经历的红节点的数目"。假设x是根节点,则可以得出结论"bh(x) >= h/2"。

进而,我们只需证明 "高度为h的红黑树,它的包含的黑节点个数至少为 2bh(x)-1个"即可。

    到这里,我们将需要证明的定理已经由

"一棵含有n个节点的红黑树的高度至多为2log(n+1)" 

    转变成只需要证明

"高度为h的红黑树,它的包含的内节点个数至少为 2bh(x)-1个"。

下面通过"数学归纳法"开始论证高度为h的红黑树,它的包含的内节点个数至少为 2bh(x)-1个"。

(01) 当树的高度h=0时,

内节点个数是0,bh(x) 为0,2bh(x)-1 也为 0。显然,原命题成立。

(02) 当h>0,且树的高度为 h-1 时,它包含的节点个数至少为 2bh(x)-1-1。这个是根据(01)推断出来的!

下面,由树的高度为 h-1 的已知条件推出“树的高度为 h 时,它所包含的节点树为 2bh(x)-1”。

    当树的高度为 h 时,

    对于节点x(x为根节点),其黑高度为bh(x)。

    对于节点x的左右子树,它们黑高度为 bh(x) 或者 bh(x)-1。

根据(02)的已知条件,我们已知 "x的左右子树,即高度为 h-1 的节点,它包含的节点至少为 2bh(x)-1-1 个";

所以,节点x所包含的节点至少为 ( 2bh(x)-1-1 ) + ( 2bh(x)-1-1 ) + 1 = 2^bh(x)-1。即节点x所包含的节点至少为 2bh(x)-1。

    因此,原命题成立。

由(01)、(02)得出,"高度为h的红黑树,它的包含的内节点个数至少为 2^bh(x)-1个"。

    因此,“一棵含有n个节点的红黑树的高度至多为2log(n+1)”


构建一个红黑树:

1. 每个节点有颜色属性,设置为枚举红色或者黑色,默认为插入红色。

2.根节点是黑色,  只需要定义一个root 节点不管最后结果如何, 我们置为黑色即可

3. 把null 默认为黑色,即孩子节点为空的时候即为黑色同样也是作为叶子节点

4. 每个红色节点的孩子节点都为黑色。那么即不可能存在两个相邻的红色节点。这点也OK

5. 性质五,我们只需要每次插入的节点置为红色,则不改变整个红黑树的平衡即可。


在开始构造前来先看树的旋转

树的旋转分为左旋和右旋

左旋


左旋的合理性 : 

第一Y 能否可以作为父亲节点,这个回顾我们二叉树的定义,如果X 能够作为左节点或者右节点是满足条件A(大于或者小于)

那么其子孙节点同样也是满足其条件(回想插入规则)

Y是X的右子节点,那么意味Y>X.同样X就可以作为Y的左子节点

同样β左Y的左子节点,他也是满足大于X的特性满足作为X的右节点。

理解左旋之后,看看下面一个更鲜明的例子。你可以先不看右边的结果,自己尝试一下。


右旋合理性,同左旋合理性

看完 左旋和右旋我们看下红黑树面临的六种情况首先我们上代码来看看JDK 如何来实现红黑树的插入的

private void fixAfterInsertion(Entry x) {

//新节点着色

    x.color = RED;

    //循环到新节点 不为空且不是根且根的节点不是红色

    while (x !=null && x != root && x.parent.color == RED) {

//如果X的父节点(假设为:P)是其父节点的父节点(假设为:G)的左节点

        if (parentOf(x) == leftOf(parentOf(parentOf(x)))) {

//获取父节点的父节点的右节点y

            Entry y = rightOf(parentOf(parentOf(x)));

            //        G

//      /  \

//    p      y

//    /

//  x

            if (colorOf(y) == RED) {

setColor(parentOf(x), BLACK);

                setColor(y, BLACK);

                setColor(parentOf(parentOf(x)), RED);

                // ?????

                x = parentOf(parentOf(x));

            }else {

//右旋

                if (x == rightOf(parentOf(x))) {

x = parentOf(x);

                    //以X的父节点的父节点(G)为中心左旋转

                    rotateLeft(x);

                }

setColor(parentOf(x), BLACK);

                setColor(parentOf(parentOf(x)), RED);

                rotateRight(parentOf(parentOf(x)));

            }

}else {

//如果X的父节点(假设为:P)是其父节点的父节点(假设为:G)的右节点

//                G

//              /  \

//            y    P

//                    \

//                    x

//

            Entry y = leftOf(parentOf(parentOf(x)));

            if (colorOf(y) == RED) {

setColor(parentOf(x), BLACK);

                setColor(y, BLACK);

                setColor(parentOf(parentOf(x)), RED);

                x = parentOf(parentOf(x));

            }else {

//左旋

                if (x == leftOf(parentOf(x))) {

x = parentOf(x);

                    //以X的父节点的父节点(G)为中心右旋转

                    rotateRight(x);

                }

setColor(parentOf(x), BLACK);

                setColor(parentOf(parentOf(x)), RED);

                rotateLeft(parentOf(parentOf(x)));

            }

}

}

root.color = BLACK;

}

左边图为情况1 , 右边图为调整后






©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,142评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,298评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,068评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,081评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,099评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,071评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,990评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,832评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,274评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,488评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,649评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,378评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,979评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,625评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,643评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,545评论 2 352

推荐阅读更多精彩内容

  • 树的概述 树是一种非常常用的数据结构,树与前面介绍的线性表,栈,队列等线性结构不同,树是一种非线性结构 1.树的定...
    Jack921阅读 4,448评论 1 31
  • 介绍 红黑树是一个平衡的二叉树,但不是一个完美的平衡二叉树。虽然我们希望一个所有查找都能在~lgN次比较内结束,但...
    小陈阿飞阅读 1,214评论 0 3
  • R-B Tree简介 R-B Tree,全称是Red-Black Tree,又称为“红黑树”,它一种特殊的二叉查找...
    张晨辉Allen阅读 9,256评论 5 30
  • 数据结构与算法--从平衡二叉树(AVL)到红黑树 上节学习了二叉查找树。算法的性能取决于树的形状,而树的形状取决于...
    sunhaiyu阅读 7,646评论 4 32
  • 0. 什么是树 数据的基本单位是数据元素,在涉及到数据处理时数据元素之间的关系称之为结构,我们依据数据元素之间关系...
    安安zoe阅读 486评论 0 0