二叉树
二叉树可以为空。二叉树结点的子树要区分左子树和右子树,即使只有一棵子树也要进行区分,说明它是左子树,还是右子树。这是二叉树与树的最主要的差别。
遍历二叉树:
-
先序遍历DLR:根节点->左子树->右子树
-
中序遍历LDR:左子树->根节点->右子树。必须要有中序遍历才能得到一棵二叉树的正确顺序
-
后续遍历LRD:左子树->右子树->根节点。需要栈的支持。
-
层次遍历:用一维数组存储二叉树时,总是以层次遍历的顺序存储结点。层次遍历应该借助队列。
搜索二叉树及查找:
完美二叉树:
完全二叉树:
注:下为非完全二叉树
AVL平衡二叉树:
平衡二叉树的调整:
RR旋转例子:
LL旋转:
LR旋转:
RL旋转:
红黑二叉树:
结构:
1)叶子节点(leaf child),和 内部节点(internal node)
红黑二叉树的每个节点都增加了2个指针,叫做 leaf child,它永远存在,而且永远都是 child,原二叉树节点,叫做 internal node。
2) 左旋,右旋, 重新着色(recolor)
左旋,右旋, 重新着色(recolor) 是红-黑二叉树的三个基本操作。
3) 规则
3.1) 根节点和 叶子节点(leaf child) 节点必须是黑节点, 内部节点(internal node)非黑即红。
3.2) 从根节点开始到每条子路径的叶子节点(leaf child),所有的黑节点数目相同。
3.3) 红节点的父亲节点必须是黑节点。
性质
- 节点是红色或黑色。
- 根是黑色。
- 所有叶子都是黑色(叶子是NIL节点)。
- 每个红色节点必须有两个黑色的子节点。(从每个叶子到根的所有路径上不能有两个连续的红色节点。)
- 从任一节点到其每个叶子的所有简单路径都包含相同数目的黑色节点(简称黑高)。
红-黑树的设计思想应该是,利用 红-黑这两种节点颜色来追踪二叉树的平衡状况, 重新着色(recolor)这个操作就是动态刷新各节点颜色,如果发现树开始出现不平衡状况,就使用 左旋(left rotate)或者右旋(right rotate)来改变树的结构。 把图(tree 2) 和(tree 4) 反过来看,它们都是不平衡树,对 (tree 2)进行右旋,或对(tree 4)进行左旋都能得到(tree 3)这样的平衡树。 左旋的实质是增加左树的高度而减少右树的高度,右旋反之。 这样交替运用这三个操作,我们就可以构建一颗平衡的二叉树。
tree 1是一个标准的红-黑树,每条的路径的黑节点数量都是 3。 tree 2和 tree 4是 tree 3 分别左旋,右旋后的结果。
recolor 操作,设想一下树 tree 1,可以把B节点 改变成红色,D和E改变成黑色,这颗红-黑树同样成立,这个操作就是 recolor。
B树、B+树:
1、概念:B树和平衡二叉树稍有不同的是B树属于多叉树又名平衡多路查找树(查找路径不只两个),数据库索引技术里大量使用者B树和B+树的数据结构,让我们来看看他有什么特点;
2、规则:
(1)树种的每个节点最多拥有m个子节点且m>=2,空树除外(注:m阶代表一个树节点最多有多少个查找路径,m阶=m路,当m=2则是2叉树,m=3则是3叉);
(2)除根节点外每个节点的关键字数量大于等于ceil(m/2)-1个小于等于m-1个;(注:ceil()是个朝正无穷方向取整的函数 如ceil(1.1)结果为2)
(3)所有叶子节点均在同一层、叶子节点除了包含了关键字和关键字记录的指针外也有指向其子节点的指针只不过其指针地址都为null对应下图最后一层节点的空格子
(4)如果一个非叶节点有N个子节点,则该节点的关键字数等于N-1;
(5)所有节点关键字是按递增次序排列,并遵循左小右大原则;
详见链接
参考:
https://www.cnblogs.com/jingcaijueyan/p/9456072.html
https://blog.csdn.net/lsr40/article/details/85230703
http://blog.csdn.net/v_JULY_v/archive/2010/12/29/6105630.aspx
http://blog.csdn.net/v_JULY_v/archive/2010/12/31/6109153.aspx
http://blog.csdn.net/v_JULY_v/archive/2011/01/03/6114226.aspx
https://blog.csdn.net/jacke121/article/details/78268602
B树,B+树
https://www.cnblogs.com/guohai-stronger/p/9225057.html
https://www.cnblogs.com/yangecnu/p/Introduce-B-Tree-and-B-Plus-Tree.html
代码实现
https://www.cnblogs.com/WindSun/p/10859055.html