目录
1、树的定义
2、二叉树
2.1、满二叉树
2.2、完全二叉树
2.3、链式存储二叉树
2.4、顺序存储二叉树
2.5、线索二叉树
2.6、赫夫曼树又叫最优二叉树
2.7、二叉查找树
3、红黑树
4、2-3-4树
4.1、插入数据项
4.1.1、如果插入到没满的节点
4.1.2、节点分裂
4.1.3、根分裂
4.2、代码实现234树
4.3、234树转红黑树
双亲节点:既是爸爸,也是妈妈。(只有一个父节点)
路径:从一个节点到子节点,所经过的节点,eg:从1到3,需要经过2,路径就是123
节点的层:从根节点开始定义,根节点可以是定义为第0层,也可以定义为第1层,不用纠结
如果根节点定义为第0层,根的子节点就为第1层;
如果根节点定义为第1层,根的子节点就为第2层。
高度、深度:参考https://blog.csdn.net/pyl574069214/article/details/105249134
节点的度:子节点的个数
节点的权:节点存的值
森林:多个独立的树,就构成了森林
任何一个节点的子节点数,都不超过2
所有叶子节点都在最后一层,而且节点的总数为:(2^n)-1【n是数的高度】
所有叶子节点都在最后一层或或倒数第二层
并且最后一层的叶子节点在左边连续,倒数第二层的叶子节点在右边连续
前序遍历:从根节点开始,先自己,再左,然后右(左子树-->根节点-->右子树)
中序遍历:先左,再自己,然后右(根节点-->左子树-->右子树)
后序遍历:先左,再右,然后自己(左子树-->右子树-->根节点)
1、任何一个二叉树都可以转为一个数组,任何一个数组都可以转为一个二叉树
2、顺序存储的二叉树,通常只考虑完全二叉树
3、在数组中,假设节点的索引是n,这个节点的左子节点索引是:2*n+1,右子节点索引是:2*n+2,父节点索引是:(n-1)/2
在大多数情况下,使用数组表示树效率是很低的。
大顶堆:父节点大于任何一个子节点
小顶堆:任何一个子节点都比父节点大
升序排序用大顶堆,降序排序用小顶堆
中序线索化二叉树:左指向前一个,右指向后一个
线索化二叉树时,一个节点的前一个节点,叫前驱节点,一个节点的后一个节点,叫后继节点
带权路径:路径的节点数 * 节点的权值,
eg:从根节点到权值为9的节点,中间经过3号节点,那么权值为9的这个节点的带权路径=2*9=18
树的带权路径长度WPL:树中所有叶子节点的带权路径长度之和。
WPL:weighted path length
树的带权路径长度(Weighted Path Length of Tree,简记为WPL)
WPL值最小的叫最优二叉树。
(1)若左子树不空,则左子树上所有节点的值均小于它的根节点的值;
(2)若右子树不空,则右子树上所有结点的值均大于它的根节点的值;
(3)左、右子树也分别为二叉排序树。
因为物理删除节点代码实现比较复杂,可以考虑在Node类中加一个属性isDelete,做逻辑删除。
平衡二叉查找树:从根节点到叶子节点,最长深度不超过最短深度的2倍。
平衡二叉查找树的查找、插入、删除等操作的时间复杂度为O(log n),底数为2。
二叉查找树的时间复杂度在O(log n)~O(n)之间。
二叉查找树的遍历可能不如数组、链表,但是在大型数据库中,遍历是很少使用的操作。
https://blog.csdn.net/pyl574069214/article/details/105425917
2-3-4树:是一种多叉树,每个节点最多有三个数据项、每个节点最多有4个子节点
1、非叶节点有三种情况:
1、有一个数据项的节点,一定有两个子节点;
2、有二个数据项的节点,一定有三个子节点;
3、有三个数据项的节点,一定有四个子节点
简而言之,非叶节点的子节点,一定比它含有的数据项多1。
eg:子节点个数为L,数据项个数为D,那么:L=D+1
2、数据项值的取值范围
2-3-4树中一般不允许出现重复数据项值,所以不考虑相同的数据项的情况。
只能插入到叶子节点
如果插入的数据项,比这个节点已有的数据项小,就将节点中大的数据项往右移,然后将插入的数据项插入该节点。
如果往下寻找插入位置的途中,有节点中的数据项是满的,节点必须分裂 (分裂能保证2-3-4树的平衡)
节点分裂的步骤:
1、创建一个新的空节点,它是被分裂节点的兄弟,在被分裂节点的右边;
2、数据项C移动到新节点中;
3、数据项B移动到被分裂节点的父节点中;
4、数据项A不动;
5、最右边的两个子节点从被分裂处断开,连到新节点上。
如果一开始查找插入节点时就碰到满的根节点,节点分裂的步骤:
1、创建新的根节点,它是被分裂节点的父节点;
2、创建第二个新的节点,它是被分裂节点的兄弟节点,在被分裂节点的右边;
3、数据项C移到新的兄弟节点中;
4、数据项B移到新的根节点中;
5、数据项A不动;
6、被分裂节点最右边的两个子节点断开连接,连到新的兄弟节点中。
根分裂完成后,整个树的高度加1。
DataItem类
Node类
Tree234类