树的基本概念、二叉树、BST、BBST(八大数据结构

树的基本概念部分

树是一种抽象的、分层的、递归的数据结构。

树的定义:n(n>=0)个有限节点组成的具有层次关系的集合。n=0时,称为空树。

也可以树由根节点和多个不相交的子树构成。并且,这些互不相交的子树构成了森林。

节点的度:节点的子节点数

树的度:树中最大的节点的度

节点深度:跟自然界一样,从上到下,从1依次递增 (有的教材定义从0开始

节点高度:跟自然界一样,从下到上,从1依次递增

树的深度 / 高度:树中最大的节点深度/ 高度

叶子节点:度为0的节点

分支节点:度不为0的节点

双亲结点:节点唯一的前驱结点

孩子节点:节点的子节点

祖先节点:节点的双亲节点的双亲结点 到 根节点之间的所有节点 ,闭区间

子孙节点:节点的孩子节点的孩子节点 到 叶子节点之间的所有节点,闭区间

兄弟节点:具有相同双亲结点的节点

堂兄弟节点:双亲节点不一样、但在同一层次的节点

根节点:树中唯一的没有双亲节点的节点

内部节点:除了根节点和叶子节点以外的所有节点
在这里插入图片描述
如图,A是根节点,K、L、M都是叶子节点,其他的都是分支节点;

B、C、D都是A的孩子节点,A是 B、C、D的双亲节点;

B、A都是K的祖先节点,E、K都是A的子孙节点;

B、C、D互为兄弟节点,F、G互为堂兄弟节点

内部节点有B、C、D、E、F、G、H、I、J

该树的度为3,树的高度为4。

有序树:树中节点的左右子树的出现是有次序的,如果交换,就变成了另一棵不同的树。
二叉查找树就是典型的有序树。

无序树:与有序树相反。

结点的权:在一些应用中,赋予树中结点的一个有某种意义的实数。

结点的路径:结点到根节点的路线。

结点的路径长度:结点到树根之间的路径长度。

结点的带权路径长度:结点到树根之间的路径长度 * 该结点的权值。
  
  
树的路径:从根节点到某个叶子结点的路线。
 
树的路径长度:从根结点到每一个结点的路径长度之和。
【ps:在结点数目相同的二叉树中,完全二叉树的路径长度最短。】

树的加权路径长度:所有叶结点的加权路径长度之和。

树内部路径长度:除叶结点外的所有结点的路径长度之和。
树外部路径长度:所有叶结点的路径长度之和。

森林:不相交的树构成的集合。把一棵树的根节点去掉,就形成森林。

树的性质

1、树的结点数 = 边数 + 1(即树的度+1

2、度为 m 的树中第 i 层上至多有 在这里插入图片描述个结点( i >= 1)

3 、高度为 h 的 m 叉树至多有在这里插入图片描述个结点
4 、具有 n 个结点的 m 叉树的最小高度为 在这里插入图片描述

二叉树

定义:度小于等于 2的树。二叉树是有序树。

特殊二叉树:

1、斜树
(1)左斜树:所有节点都只有左子树的二叉树
(2)右斜树:所有节点都只有右子树的二叉树

2、满二叉树

在二叉树中,所有分支节点都有左子树和右子树,并且叶子节点们在同一层。在这里插入图片描述
3、完全二叉树

在二叉树中,所有叶子节点的深度 <=1,最后一层中所有节点都聚集在左边 的树。
在这里插入图片描述

二叉树的存储结构

1、使用数组进行存储

即,结点的位置用数组索引来代表。

适用于完全二叉树/满二叉树,刚好能使数组的空间占满;

否则,会造成数组中多个位置不存在结点,尤其是斜树,会大大浪费内存空间。如图

在这里插入图片描述

2、使用二叉链表

即,使用含一个 数据域和两个指针域(分别指向左右孩子) 来定义结点的数据结构。
在这里插入图片描述

二叉树的遍历方式

1、前序遍历/ 深度遍历
2、中序遍历
3、后序遍历
4、层次遍历/ 广度遍历

顾名思义,前序遍历就是将根节点、双亲结点优先遍历,再分别遍历左子树、右子树结点;
而广度遍历就是按层次,由浅到深进行遍历 。

在这里插入图片描述

以上图为栗:
前序遍历/ 深度遍历: ABDEGCF (一个结点一定比他的左 / 右子树优先遍历
中序遍历:DBGEACF (当一个结点有左子树还没遍历,那一定还没轮到它
后序遍历:DGEBFCA (当一个结点有左 / 右子树还没遍历,那一定还没轮到它
层次遍历 /广度遍历:ABCDEFG

二叉搜索树/ 二叉排序树 Binary Search Tree

定义:所有左子节点都小于根节点、所有右子节点都大于根节点,且树中的每一节点也都符合这个性质的二叉树 / 空树

BST一般使用链表结构来实现,可以进行高效的插入、查询、删除等操作。

其操作复杂度与树的高度有关,如果共有n个元素,那么平均每次操作最少需要O(logn)的时间。

ps:下方的程序实现代码中提到了继承节点,其定义如下:
在这里插入图片描述
也称其为“直接后继” ,在代码中 ,同理亦可用“直接前驱” 节点来互换值。

上面提到,BST的相关操作复杂度与其树高度有着密不可分的联系 。举个栗子,当二叉树的结构变成一种类似于斜树的结构时,此时树达到同节点总数的树最高度,此时的树相当于变成了一个链表,查询效率会大大降低。

因此,我们需要引入对树的高度进行适度控制的:

平衡二叉搜索树 BBST

定义:任一节点的平衡因子都在 [-1, 0, 1] 之间的二叉搜索树,即,任一节点的左右子树高度差不超过1的BST

ps:注意这并不代表树中任意两个节点的高度之差一定是小于等于1哦,是有可能大于1的。

平衡因子:节点的【左子树高度 - 右子树高度】所得。

那么我们是怎么实现高度差的控制呢…
那就是通过左旋、右旋以及两者的组合啦!(没错就是左旋肉碱的左旋😏

实现四种遍历以及二叉搜索树的建、增、删、查、以及BBST的调节的java代码实现在这里

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值