在二叉查找树中:html
与次优二叉树相对,二叉排序树是一种动态树表。其特色是:树的结构一般不是一次生成的,而是在查找过程当中,当树中不存在关键字等于给定值的结点时再进行插入。新插入的结点必定是一个新添加的叶子结点,而且是查找不成功时查找路径上访问的最后一个结点的左孩子或右孩子结点。git
1.首先执行查找算法,找出被插结点的父亲结点。
判断被插结点是其父亲结点的左、右儿子。将被插结点做为叶子结点插入。
若二叉树为空。则首先单独生成根结点。首先执行查找算法,找出被插结点的父亲结点。
判断被插结点是其父亲结点的左、右儿子。将被插结点做为叶子结点插入。
若二叉树为空。则首先单独生成根结点。算法
2.执行删除结点算法
在二叉排序树删去一个结点,分三种状况讨论:
1.若结点为叶子结点,即左子树和右子树均为空树。因为删去叶子结点不破坏整棵树的结构,则能够直接删除此子结点。
2.若结点只有左子树或右子树,此时只要令或直接成为其双亲结点的左子树或右子树便可,做此修改也不破坏二叉排序树的特性。
3.若结点的左子树和右子树均不空。在删去结点以后,为保持其它元素之间的相对位置不变,可按中序遍历保持有序进行调整,能够:
令结点的直接前驱(或直接后继)替代该结点,而后再从二叉排序树中删去它的直接前驱(或直接后继)即让结点的左子树(若是有的话)成为结点左子树的最左下结点(若是有的话),再让左子树成为结点的左右结点的父结点。数据结构
平衡二叉查找树是带有平衡条件的二叉查找树。平衡条件:每一个节点的左子树和右子树的高度差最多为1二叉查找树(其中空树的高度为-1)
思想:
向平衡二叉树中插入一个新结点后破坏了平衡二叉树的平衡性。首先要找出插入新结点后失去平衡的最小子树根结点的指针。而后再调整这个子树中有关结点之间的连接关系,使之成为新的平衡子树。当失去平衡的最小子树被调整为平衡子树后,原有其余全部不平衡子树无需调整,整个二叉排序树就又成为一棵平衡二叉树。学习
假设因为在二叉排序树上插入结点而失去平衡的最小子树根结点的指针为a(即a是离插入点最近,且平衡因子绝对值超过1的祖先结点),则失去平衡后进行进行的规律可概括为下列四种状况:.net
LL型
平衡二叉树某一节点的左孩子的左子树上插入一个新的节点,使得该节点再也不平衡。这时只须要把树向右旋转一次便可,如图所示,原A的左孩子B变为父结点,A变为其右孩子,而原B的右子树变为A的左子树,注意旋转以后Brh是A的左子树(图上忘在A于Brh之间标实线)
设计
RR型
平衡二叉树某一节点的右孩子的右子树上插入一个新的节点,使得该节点再也不平衡。这时只须要把树向左旋转一次便可,如图所示,原A右孩子B变为父结点,A变为其左孩子,而原B的左子树Blh将变为A的右子树。
指针
LR型
平衡二叉树某一节点的左孩子的右子树上插入一个新的节点,使得该节点再也不平衡。这时须要旋转两次,仅一次的旋转是不可以使二叉树再次平衡。如图所示,在B节点按照RR型向左旋转一次以后,二叉树在A节点仍然不能保持平衡,这时还须要再向右旋转一次。
调试
RL型
平衡二叉树某一节点的右孩子的左子树上插入一个新的节点,使得该节点再也不平衡。一样,这时须要旋转两次,旋转方向恰好同LR型相反。
htm
一、当插入的节点是根节点时,直接涂黑便可;
二、当要插入的节点的父节点是黑色的时候。
三、若是要插入的节点的父节点是红色且父节点是祖父节点的左支的时候。
这个要分两种状况,一种是叔叔节点为黑的状况,一种是叔叔节点为红的状况。
当叔叔为黑时,也分为两种状况,一种是要插入的节点是父节点的左支,另外一种是要插入的节点是父亲的右支。
咱们先看一下当要插入的节点是父节点的左支的状况:
这个时候违反了性质四,咱们就须要进行调整操做,使之符合性质四,咱们能够经过对祖父节点进行右旋同时将祖父节点和父节点的颜色进行互换,这样就变成了:
通过这样的调整能够符合性质四而且不对其余性质产生破坏。
当插入的节点是父节点的右支的时候:
当要插入的节点是父节点的右支的时候,咱们能够先对父节点进行左旋,变成以下:
若是咱们把原先的父节点看作是新的要插入的节点,把原先要插入的节点看作是新的父节点,那就变成了当要插入的节点在父节点的左支的状况,对,是的,就是按照当要插入的节点在父节点的左支的状况进行旋转,旋转完以后变成以下:
四、若是要插入的节点的父节点是红色且父节点是祖父节点的右支的时候;
这个时候的状况跟状况3所表述的状况是一个镜像,将状况3的左和右互换一下就能够了。
五、若是要插入的节点的父节点是红色而且叔叔节点也为红色,以下:
这个时候,只需将父亲节点和叔叔节点涂黑,将祖父节点涂红。
以上就是插入的所有过程。
无
正确使用Markdown语法(加1分)
模板中的要素齐全(加1分)
教材学习中的问题和解决过程, (加3分)
感想,体会真切的(加1分)
点评认真,能指出博客和代码中的问题的(加1分)
这一周花了点心思在这一章上面,也好好阅读了不少内容,掌握的还算能够。
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 0/0 | 1/1 | 10/10 | |
第二周 | 700/700 | 1/2 | 10/20 | |
第三周 | 700/1400 | 1/3 | 10/30 | |
第四周 | 500/1900 | 2/5 | 10/40 | |
第五周 | 569/2469 | 1/6 | 10/50 | |
第六周 | 1070/3539 | 1/7 | 10/60 | |
第七周 | 1070/3539 | 1/8 | 10/70 |
计划学习时间:10小时
实际学习时间:10小时