第一篇:数据结构与算法
链表:
快慢指针:一个慢指针(一次走一步)一个快指针(一次走两步)
应用:判断链表是否有环,判断环的入口位置,求中位数,求倒数第k位等
判断链表是否有环:直接一快一慢去走,如果能碰到,那么说明有环,如果快指针走到NULL,那么无环
判断环入口位置:一快一慢走去,如果碰到了,那么将,慢指针放回入口,然后快慢指针同时步长为1,相遇的即为环入口
求中位数:快指针到重点,慢指针所在位置即为中位数,因为步长是他的两倍
树:
二叉排序树:也称为二叉查找树,遵从一个规则,左子树的所有节点的值都比当前节点值小,右子树所有的值都比当前节点的值大
然后直接每次插入一个节点直接去找就好了,但是这样建树会有最坏情况,有可能建出左斜树或者右斜树,复杂度和数组查找相似
难点:删除节点的时候,如果删除的该节点只有一个儿子,那么直接把这个儿子代替父亲的位置即可
如果两个儿子都有的话,这个时候就要好好考虑一下,因为要求删除后还是二叉排序树,那就选择右边子树中的最小的那个节点,这个既可以大于当前节点的所有,又小于右边所有
即一直递归右子树的左子树一直左左左找到最小的那个节点然后代替当前位置即可
平衡二叉树:基于二叉排序树的所有要求,因为二叉排序树有建树可能不完美的情况,所以,又有了平衡二叉树,前提就是必须书二叉排序树
平衡二叉树和二叉排序树的不同就是,平衡树多了平衡因子,当前节点的左右子树高度之差要小于等于1,所以平衡因子的值在【-1,1】之间
平衡二叉树构造的核心要点就是在于插入节点的时候如何把它给转换成平衡二叉树
参考博文:https://blog.csdn.net/isunbin/article/details/81707606
针对化成平衡二叉树的时候有四种情况
LL LR RR RL
核心要点:三个点而造成的高度差时,只要把三点中间这个点拿出来当作根节点即可,然后移动节点的时候主要要满足二叉查找树的要求即可
字母含义 LL 代表当前节点的平衡因子不在【-1,1】时候,刚刚插入的节点在左子树的左子树位置,其他类似
我们可以清晰看到LL RR移动的时候的作用,看图、
LR其实是一样的他要的达到的目的正好是 RR LL可以达到
插入删除都和二叉排序树是一样的,只是插入删除后要判断是四型中的哪一款,然后进行子树修正
RL其实就是 一次 LL RR来达到的
(下面几张皆是盗的博文中的图,博主莫怪^_^)
LL型
简单形式
一般形式
具体形式
RR型
简单形式
一般形式
具体形式
LR型
简单形式
一般形式
具体形式
RL型
简单形式
一般形式
具体形式
堆
用数组模拟了二叉树,利用数组索引来模拟左右