大家好,欢迎来到IT知识分享网。
点击上方关注,每天进步一点点
本文思维导图
简述
先不说平衡二叉树,我们单开来说,这样比较方便理解。
先说二叉树,再说平衡条件,没那么多花里胡哨的理论,我只是想让大家看完能明白,能写出来。
二叉树
什么是二叉树?二叉树数据结构,顾名思义,只有两个叉,在数据结构中,操作性能要远高于线性结构,有O(height)的索引性能。与线性结构有相同的空间复杂度,特性如下:
- 每个节点最多只有两个儿子节点
- 左儿子小,右儿子大 (大小按照我们默认的比较规则,本例用int来比较)
线行找7与二叉数找7
线性找7
二叉树找7
okay,我想大家聪明人已经看出来了,二叉树搜索用了2次,而线性结构却用了5次。
说白了,二叉树结构,我每次问一个节点,都会离着我的目标越来越近,但是线性的则不然,我必须一个个问。
说到这儿,我想会有博友提出质疑了,如果线性查找,7恰好就在第一个呢?那不是一下就找到了吗?
哈哈,你怎么不上天呢 – -。还第一个。开个小玩笑。
这就是二叉树索引的好处。相比看图比码字要清楚的多。
平衡条件
那么,什么叫平衡呢?其实很简单,任何一个节点的子节点高度差必须小于2
第一个二叉平衡树
- 从下往上数,第一个高度为1(比较符合日常生活数数),那我们数数吧
- 5:———1高度 | 4,7,23,71 ———2高度| 6,50 ———3高度 | 15 ———4高度
- 比如节点6,那么4和7的高度都是2,那就2-2 < 2 。平衡!!
难点一 递归
递归查找
我又加入了一些节点,方便大家理解递归深度
- 每一次正向橙色线条的滚动,就是一次递归查找
- 每一次正向橙色线条的滚动,方法的入栈!
- 递归的深度,取决于线条走了几次,那就有多大的栈深度
- 本次查找,刨除root,共4次进栈
难点二 回溯
插入回溯
先不要关心这个旋转操作,如图所示,我们在递归的基础上,沿着线条理解一下回溯
- 每一次逆向橙色线条的滚动,就是一次回溯
- 操作递归的每一个节点,都会在回溯的轨迹上
- 正因为每一次递归,都有每一次回溯,那么,我们就可以先完成相关操作(增加或删除)之后,判定平衡
4种旋转
左左类型旋转
博主尽量放慢了速度,让大家看清楚究竟旋转是如何进行的,这是一个插入操作,我们看到在不平衡的时候,进行了左旋转,这里我们看到
- 正向插入,递归3-2-1
- 逆向回溯,1-2 判断平衡条件 ,是平衡的
- 再次回溯,2-3,3的左边高度为2,右边没有节点为0,那么2-0 > 1,不平衡!
到这里我们基本上理解了平衡的判断,下面正式说一下旋转:
- 判断不平衡边 在3节点判定,不平衡,那么左边高,我们需要调整左边,获取左边节点2
- 判断旋转类型 这时候我们拿到节点2,判断节点2哪边高。左边高,为左左类型。右边高为左右旋转类型,我们先不管
- 旋转操作 3.left = 2.right; 2.right = 3; 重新计算,2和3节点的高度
右右类型旋转[同上,不再叙述]
左右类型旋转
右左类型旋转
到此旋转就说完了,希望大家好好的理解第一个左左类型!(理解了一个也就都理解了 )
后续部分没有讲是因为说太多反而更乱。
后续的理解不了没关系,我们代码在看。
代码基础部分
node类
高度计算
插入操作
旋转
insert
删除操作
以上就是难点插入和删除的实现了, 没有过多阐述,是因为大家如果真的理解了上面说明的理论, 那么应该没有问题来理解这些code。
当然有任何问题大家可以在留言区回复我 ,欢迎大家指正!
4种遍历
- 前序遍历 根左右
- 中序遍历 左跟右
- 后序遍历 左右根
- 层级遍历 从root开始,一层层
https://blog.csdn.net/zhang6622056/article/details/82698859
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/57159.html