一、二叉树
1.每个节点最多有两个子节点(度不大于2)
2.满二叉树:深度为k,有2^k-1个节点
3.完全二叉树:在满二叉树的基础上右边缺几个口。深度为k,最少2^(k-1)个节点,最多2^k - 1个节点
4.节点的度:子树的个数。度为0的叫叶子节点,度不为0的叫分支节点
5.先序遍历(根左右)、中序遍历(左根右)、后序遍历(左右根)、层次遍历(队列实现)
二、二叉查找树
左小右大,没有值重复的节点
性能:插入有序时变成斜树,查找O(n);最好的情况是log2n
三、平衡二叉树
平衡因子绝对值不大于1的二叉查找树,保证效率。eg: AVL树、红黑树等
四、AVL树
1.AVL旋转操作:
右旋:右移使左儿子变成根. 假设原根为X,左右儿子为L/R,则:把L的右儿子给X当左儿子,再把X给L当右儿子
左旋:左移使右儿子变成根. 假设原根为X,左右儿子为L/R,则:把R的左儿子给X当右儿子,再把X给R当左儿子
2.左左场景:直接右旋
右右场景:直接左旋
左右场景:先左旋再右旋
右左场景:先右旋再左旋
3.AVL树和红黑树的对比:
AVL树的查询更快:AVL高度比红黑树要低;
红黑树在增删时更快:红黑特性使旋转次数减少,rebalance更快。(红黑树牺牲部分平衡性,换更快的增删.以空间换时间)
红黑树更常用:TreeMap的key用红黑树排序、HashMap用红黑树解决冲突
五、红黑树
1.节点是红色或者黑色
2.根总是黑色
3.所有叶子节点的空子节点都是黑色
4.如果节点是红色的,则它的两个子节点都是黑色的(不能有两个连续红色)
5.从任意节点到其每个叶子的所有路径,都含有相同数量的黑节点 (红黑树的平衡标准:节点到叶子的黑相同就行,不严格要求平衡因子R小于等于1)
2、红黑树是一种特殊的AVL树(非严格均衡的二叉查找树,是黑色完美平衡),在最坏的情况也有很好效率
3、结构: color + value + parent + left + right
4、增删元素时,要保证:没有两个连续红节点、到叶子的黑色数量一样。如果破坏了规矩,则使用【变色】和【旋转】维持特征
5、红黑树新增节点:
1. 新加入到红黑树中的节点默认为红色:根据上面的规则5,加入新节点之前,根到叶子的黑色数量是相同的,如果加入黑色就破坏规矩了;
2.1 新节点的parent如果是null或者黑,则直接加挂红色结束;
2.2 新节点的parent如果是红,则破坏了规矩(两个连续红),此时需要调整:
左左场景:parent是左红且新插入的在左边,构成左左连续红:先右旋,然后根+右变色
左右场景:parent是左红且新插入的在右边,构成左右连续红:先左旋变成上面的左左场景,再解决(右旋,根右变色)
右右场景:parent是右红且新插入的在右边,构成右右连续红:先左旋,然后根+左变色
右左场景:parent是右红且新插入的在左边,构成右左连续红:先右旋变成上面的右右场景,再解决(左旋+根左变色)
6、红黑树删除节点:
1.子节点两个null:直接当前节点赋null;
2.子节点一个null:用子替,必要时做简单调整
3.两个子节点都不是null:找前驱(左子树中最大的值)或者后继(右字数中最小的值)替换掉当前节点的值,然后删除前驱或者后继。前驱和后继最多只有一个子节点。