以下是以前看视频做的笔记。
栈
先进后出,后进先出
队列
先进先出,后进后出
数组
查询快,增删慢
链表
查询慢,增删快(相对数组而言)
当要根据数值找元素时,就都是一样的,都是从头开始找
但是,当根据索引来找时,双向链表比较快,因为假如n离头近可以从头开始找,若离尾近则从尾找开始找
树
二叉树
二叉树:任意节点的度都小于等于2
遍历方式
前序遍历
当前 --> 左 --> 右
中序遍历
是按从小到大的顺序遍历的,因此最重要
左 --> 当前 --> 右
后续遍历
左 --> 右 --> 当前
层序遍历
从第一层开始,一层层地遍历
二叉查找树
二叉查找树:一颗二叉树,左子树的所有节点都比当前节点小,右子树所有节点的值都比当前节点大,查找效率高
添加节点
查找节点
查找效率挺高的
中序遍历
二叉查找树最重要的是中序遍历,因为基于二叉查找树的规则,可以实现从小到大遍历
左 --> 当前 --> 右
二叉查找树的弊端
添加一些数据时,可能会出现以上的情况,会导致查询的效率非常低,就跟链表一样
平衡二叉树
为了解决二叉查找树的弊端,提出了平衡二叉树,就是在二叉查找树的基础上多了一条规则:任意节点的左子树和右子树的高度差不能超过1,重点是任意,所有节点的左右子树高度差都不能超过1
保持平衡的手段:
左旋
例1:
例2:
先找支点,从新添加的节点开始往上找,第一不平衡的父节点就是支点,然后将支点”左旋“,就是支点降级,支点的右子节点升级,替代原来支点的位置,此时支点成为原来的右子节点的左子节点
变为
右旋
例1:
例2:
先找支点,从新添加的节点开始往上找,第一不平衡的父节点就是支点,然后将支点”右旋“,就是支点降级,支点的左子节点升级,替代原来支点的位置,此时支点成为原来的左子节点的右子节点
总而言之,左旋就是支点变左子节点,右旋就是支点变右子节点
触发旋转的四种情况
左左
左左:当根节点的左子树的左子树添加节点导致不平衡,进行一次右旋即可
左右
左右:局部左旋,然后整体右旋
右右
右左
红黑树
红黑树是一种特殊的二叉查找树,通过”红黑规则“实现平衡
平衡二叉树的弊端是每插入一个节点,如果导致了不平衡就会旋转,影响效率
红黑规则
添加节点
默认添加红色的节点,因为效率高