节点:树中存储数据的单元
根节点:没有父节点的单元
父节点:一个节点的上级节点叫做这个节点的父节点,一个节点最多可以有一个父节点
子节点:一个节点的下级节点叫做这个节点的子节点,一个节点可以有多个子节点
叶子节点:没有子节点的节点
节点的权:节点的值
路径:从根节点到该节点所走过的路线,路径长度是多少取决于该路径上边的条数
边:父子节点之间的连线
字数:一某个节点(非根节点),作为根节点的树成为子树
森林:多棵子树构成森林
二叉树的遍历
深度优先遍历:
先序遍历:先根,再左,再右
中序遍历:先左,再根,再右
后续遍历:先左,再右,再根
广度优先遍历:
完全二叉树:数据从上到下从左到右依次排列
满二叉树:所有叶子节点都在同一层,最后一层节点数是2^(n-1) n是层数,根节点是第一层
有序二叉树:左边节点的值要小于当前节点,右边节点值大于当前节点,循环减半logn
平衡二叉树:左边节点的值小于当前节点,右边节点的值大于当前节点,左右两棵子树的高度差绝对值小于等于1,通过LL LR RR RL 四种旋转得到
2-3-4树:2-节点,一个数值,两个next,分出2个岔;3-节点两个数值,三个next,分3个岔;4-节点三个数值,四个next,分4个岔
红黑树:由2-3-4树转换来的2-节点就是一个黑,3-节点是黑红,4-节点是黑红红
红黑树只是内存最优
红黑树是最有二叉树
红黑树的特点: 1,每个节点不是红色就是黑色
2,根节点一定是黑色
3,如果一个节点是红色的,那么它的子节点一定是黑色的
4,每个叶子节点都是黑色的,并且都是空
5,从根节点到任意叶子节点的路径上黑色节点数目相同
6,最长的路径:黑-红-黑-红-黑-红,最短路径:黑-黑-黑
7,没有一条路径比其他路径长超过两倍,因此红黑树的时间复杂度稳定在logn
哈夫曼树:路径和路径长度
节点的权:节点的值
带权路径长度:从根节点到该节点的路径长度与该节点权值的乘积
树的带权路径长度:所有叶子节点带权路径长度之和
哈夫曼树创建: 1,将待构建的数据从小到大排序,每一个数据都看成一个节点,每一个节点的都是简单的二叉树
2,取根节点权值最小的两棵二叉树
3,组成一棵心的二叉树,新的二叉树节点的权值是前两棵二叉树根节点权值之和
4,将新的二叉树以根节点的权值大小再进行排序,不断重复1234,直到所有数据都被处理
哈夫曼编码: 1,统计各个字符出现的次数
2,按照各个字符出现的次数构建哈夫曼树,次数作为权值
3,根据哈夫曼树各个字符编码,向左走是0,向右的路径为1
4,每个字符都是一个叶子节点
解决了空间浪费大和翻译歧义的问题
多叉树:一个节点上可以分出多个叉
B树:一个节点包含多个key-value值
二节点:一对key-value能分出二个叉
三节点:二对key-value能分出三个叉
四节点:三对key-value能分出四个叉
一棵M阶B树:每个节点最多又M-1个key并且key以升序排列,每个节点最多有M个节点(叉)
B+树:B+树的非叶子节点仅仅具有索引的作用,也就是说非叶子节点只能存key,不能存value,B+树的所有叶子节点构成一个有序链表
B+树的优点: 1,B+树的非叶子节点上不包含真正的数据,只当作索引使用,在内存相同的情况下,能够存放更多的key值
2,B+树的叶子节点相连,所以想要遍历整棵树只需要一次遍历叶子节点即可
树的删除:三种情况:
1:删除叶子节点
(1)找到要删除的节点target
(2)要删除节点的父节点parent,考虑有没有父节点
(3)没有父节点,本身又是叶子节点,这棵树就只有一个节点 root = null;
(4)如果有父节点,确定要删除的节点是partent的左孩子还是右孩子,如果是父节点的左孩子partent.left = null,如果是父节点的右孩子partent.right = null
2:删除只有一个子树的节点
(1)找到要删除的节点target
(2)要删除节点的父节点parent,考虑有没有父节点
(3)没有父节点的话就是根节点,确定根节点有左子树还是有右子树,如果是有左子树的话 root = target.left,如有有右子树的话,root = target.right
(4)有父节点的话,要先确定target是parent的左孩子还是右孩子,还要判断target有左孩子还是右孩子
4.1,parent.left = target.left
4.2,parent.left = target.right
4.3,parent.right = target.left
4.4,parent.right = target.right
3:删除有两颗子树的节点
(1)找到要删除的节点target
(2)找target左子树的最大值或右子树的最小值
(3)(右子树的最小值)替换目标节点的值
(4)删掉右子树的最小值(删除叶子节点或者删除两棵子树的节点)
哈希表: 数据存储:num%arr.length