树
-
预备知识
-
深度:根节点为0,从叶子到根节点最长的路径
-
先序遍历:为节点标记深度
-
中序遍历:查找二叉树的输出
-
后序遍历:计算树的深度
-
二叉树
-
构造表达树:将后缀表达式转换成表达树
-
如果符号是数字,进栈;
-
如果符号是操作符,则弹出两个数字,作为左右节点,根节点为操作符
-
再把这棵树进栈
-
二叉查找树:左节点小于根节点,根节点小于右节点
-
关于查找某一个节点是否存在,可以通过不断与根节点比较,利用二叉查找树的特性,判断是查左节点还是右节点,还是本节点就是要查找的结点,也算是二分查找的本质
-
查找最大值或最小值。最左节点就是最小值,最右节点就是最大值
-
插入某一个节点,跟查找很像,就是在不断判断属于左子树还是右子树,属于之后,当节点为null,那么本节点就插在这个位置
-
由于二叉查找树不予许有重复的值,那么如果该节点存在就无需操作
-
删除的策略
-
如果是叶子就直接删除
-
如果只有一个儿子,就把他的父亲指向他的独子
-
如果有两个则,寻找右子树的最小节点,也就是右子树的最左子树来替换这个节点,将节点的数据复制到要删除的结点,替换他,再删除最小的那个节点,也就是最小节点的右子树顶上
-
懒惰删除策略:不删除,只是标记不使用
-
使用中序遍历可以将二叉查找树排序输出
-
AVL平衡查找树:平衡条件每个节点左右子树高度小于等于1
-
不改变树结构的操作可直接使用标准二叉查找树的程序
-
主要改变树结构后恢复起来复杂,特别是删除
-
对插入破坏平衡条件靠旋转来简单调整
-
寻找失去平衡的最深节点
-
对外边情况导致的失去平衡,(左左,右右的情况),通过单旋转调整
-
抽象的认为抓住那个节点使他在重力下自动下垂,再把接上去
-
对内边情况,(左右,右左)双旋转
-
伸展树·比平衡二叉查找树的调整简单点,节点可以达到任意深度
-
本质,当一个节点被访问后,经过一系列的AVL树的旋转被推到根上
-
许多应用中一个节点被访问后不久将再被访问
-
通过展开,在旋转的同时降低深度,在旋转中填补null
-
B树:M叉排序树,
-
-
主要操作是分裂
-
-
B+树:M阶平衡树,Mysql索引的核心(M为磁盘页大小)
-
M阶B+树特性
-
数据存储在叶子上,叶子结点相连(双向链表),数据和节点一样多
-
非叶子存储直到M-1个关键字以指示搜索方向;关键字i代表子树i-1的最小关键字
-
树的根可能是叶子,也可能他的儿子树在2和M之间
-
除了根之外,所有非叶子节点的儿子树在M/2到M之间
-
所有叶子都在相同深度上并有L/2和L之间个数据项
-
标准库中的集合和映射
-
Set接口:不允许有重复元素
-
SortedSet给出一种特殊类型的Set,保证各项处于有序状态
-
保持各项有序的set的实现是TreeSet
-
关于Map接口:键值对
-
关键字是唯一的,但不同的关键字可以映射到同一个值
-
SortedMap接口的一种实现是TreeMap类
-
不提供迭代器
-
TreeMap和TreeSet类的实现
-
使用自顶向下的红黑树实现
-
红黑树:AVL的一种流行变种
-
具有着色性质的二叉查找树:条件
-
每个节点不是红就是黑,
-
根节点为黑
-
如果一个节点是红色,那么它的子节点就是黑色
-
从一个节点到一个null节点的引用(也就是看不见的节点)的每一条路径,必须包含相同数目的黑色节点
-
高度最多是2log(N+1),因此查找操作最多是一种对数操作
-
平衡操作:变颜色,左旋,右旋
-
新加入的节点总是红色的
-
因为被插入前的树结构是构建好的,一但我们进行添加黑色的节点,无论添加在哪里都会破坏原有路径上的黑色节点的数量平等关系,所以插入红色节点是正确的选择。 若是黑色就违反条件4
-
若父节点为红,那么就会违背条件3,这时就需要进行颜色的改变和树的旋转(红黑树基本操作)
-
插入:(新元素为红色)
-
-
自底向上插入
-
新插入项的父亲是黑色,就直接插入
-
父亲是红色:
-
叔叔是红色:
-
父亲和叔叔变黑
-
爷爷变红
-
指针定位到爷爷节点,进行判断是否还需平衡操作
-
-
兄弟是黑色,当前是红色,且是右子树
-
左旋:操作:自己,父亲,左儿子
-
当前往上提,父亲往下左移,做儿子,过继给父亲做右儿子
-
-
兄弟是黑色,当前是红色,且是左子树
-
右旋:操作父亲、爷爷、兄弟
-
父亲向上提,爷爷向下右移,两者颜色改变,兄弟变成爷爷的左儿子
-
-
-
-
-
浪波激泥