数据结构——树

节点:树中存储数据的单元

根节点:没有父节点的单元

父节点:一个节点的上级节点叫做这个节点的父节点,一个节点最多可以有一个父节点

子节点:一个节点的下级节点叫做这个节点的子节点,一个节点可以有多个子节点

叶子节点:没有子节点的节点

节点的权:节点的值

路径:从根节点到该节点所走过的路线,路径长度是多少取决于该路径上边的条数

边:父子节点之间的连线

字数:一某个节点(非根节点),作为根节点的树成为子树

森林:多棵子树构成森林


二叉树的遍历
    
    深度优先遍历:
        先序遍历:先根,再左,再右
        中序遍历:先左,再根,再右
        后续遍历:先左,再右,再根
    
    广度优先遍历:

完全二叉树:数据从上到下从左到右依次排列

满二叉树:所有叶子节点都在同一层,最后一层节点数是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

  • 13
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值