java数据结构---树(二叉树、红黑树、2-3-4树)

目录

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树转红黑树


1、树的定义

双亲节点:既是爸爸,也是妈妈。(只有一个父节点)

路径:从一个节点到子节点,所经过的节点,eg:从1到3,需要经过2,路径就是123

节点的层:从根节点开始定义,根节点可以是定义为第0层,也可以定义为第1层,不用纠结

                 如果根节点定义为第0层,根的子节点就为第1层;

                 如果根节点定义为第1层,根的子节点就为第2层。

高度、深度:参考https://blog.csdn.net/pyl574069214/article/details/105249134

节点的度:子节点的个数

节点的权:节点存的值

森林:多个独立的树,就构成了森林

2、二叉树

任何一个节点的子节点数,都不超过2

    2.1、满二叉树

所有叶子节点都在最后一层,而且节点的总数为:(2^n)-1【n是数的高度】

    2.2、完全二叉树

所有叶子节点都在最后一层或或倒数第二层

并且最后一层的叶子节点在左边连续,倒数第二层的叶子节点在右边连续

    2.3、链式存储二叉树

前序遍历:从根节点开始,先自己,再左,然后右(左子树-->根节点-->右子树
中序遍历:先左,再自己,然后右(根节点-->左子树-->右子树
后序遍历:先左,再右,然后自己(左子树-->右子树-->根节点

    2.4、顺序存储二叉树

1、任何一个二叉树都可以转为一个数组,任何一个数组都可以转为一个二叉树

2、顺序存储的二叉树,通常只考虑完全二叉树

3、在数组中,假设节点的索引是n,这个节点的左子节点索引是:2*n+1,右子节点索引是:2*n+2,父节点索引是:(n-1)/2

在大多数情况下,使用数组表示树效率是很低的。

大顶堆:父节点大于任何一个子节点

小顶堆:任何一个子节点都比父节点大

升序排序用大顶堆,降序排序用小顶堆

    2.5、线索二叉树

中序线索化二叉树:左指向前一个,右指向后一个

线索化二叉树时,一个节点的前一个节点,叫前驱节点,一个节点的后一个节点,叫后继节点

    2.6、赫夫曼树又叫最优二叉树

带权路径:路径的节点数 *  节点的权值,

              eg:从根节点到权值为9的节点,中间经过3号节点,那么权值为9的这个节点的带权路径=2*9=18

树的带权路径长度WPL:树中所有叶子节点的带权路径长度之和。
WPL:weighted path length
树的带权路径长度(Weighted Path Length of Tree,简记为WPL)

WPL值最小的叫最优二叉树

    2.7、二叉查找树

(1)若左子树不空,则左子树上所有节点的值均小于它的根节的值;

(2)若右子树不空,则右子树上所有结点的值均大于它的根节的值;

(3)左、右子树也分别为二叉排序树。

因为物理删除节点代码实现比较复杂,可以考虑在Node类中加一个属性isDelete,做逻辑删除

平衡二叉查找树:从根节点到叶子节点,最长深度不超过最短深度的2倍

平衡二叉查找树的查找、插入、删除等操作的时间复杂度为O(log n),底数为2。

二叉查找树的时间复杂度在O(log n)~O(n)之间。

二叉查找树的遍历可能不如数组、链表,但是在大型数据库中,遍历是很少使用的操作。

3、红黑树

https://blog.csdn.net/pyl574069214/article/details/105425917

4、2-3-4树

2-3-4树:是一种多叉树,每个节点最多有三个数据项、每个节点最多有4个子节点
    1、非叶节点有三种情况
        1、有一个数据项的节点,一定有两个子节点;
        2、有二个数据项的节点,一定有三个子节点;
        3、有三个数据项的节点,一定有四个子节点
    简而言之,非叶节点的子节点,一定比它含有的数据项多1。
    eg:子节点个数为L,数据项个数为D,那么:L=D+1
    2、数据项值的取值范围
        2-3-4树中一般不允许出现重复数据项值,所以不考虑相同的数据项的情况

     4.1、插入数据项

只能插入到叶子节点

     4.1.1、如果插入到没满的节点

        如果插入的数据项,比这个节点已有的数据项小,就将节点中大的数据项往右移,然后将插入的数据项插入该节点。

如果往下寻找插入位置的途中,有节点中的数据项是满的,节点必须分裂 (分裂能保证2-3-4树的平衡)

     4.1.2、节点分裂

    节点分裂的步骤
        1、创建一个新的空节点,它是被分裂节点的兄弟,在被分裂节点的右边
        2、数据项C移动到新节点中;
        3、数据项B移动到被分裂节点的父节点中;
        4、数据项A不动;
        5、最右边的两个子节点从被分裂处断开,连到新节点上。

     4.1.3、根分裂 

如果一开始查找插入节点时就碰到满的根节点,节点分裂的步骤
        1、创建新的根节点,它是被分裂节点的父节点;
        2、创建第二个新的节点,它是被分裂节点的兄弟节点,在被分裂节点的右边
        3、数据项C移到新的兄弟节点中;
        4、数据项B移到新的根节点中;
        5、数据项A不动;
        6、被分裂节点最右边的两个子节点断开连接,连到新的兄弟节点中。

根分裂完成后,整个树的高度加1。

     4.2、代码实现234树

DataItem类 

Node类 

Tree234类 

     4.3、234树转红黑树

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值