数据结构之树

前言

数据结构中,树非常重要,在此记录学习

参考文章:

  1. 【数据结构】数据结构中常用的树
  2. 数据结构中"树"的全面讲解
  3. 常用数据结构——树

1. 树的定义

树是一种非线性的数据结构,是由n(n >=0)个结点组成的有限集合。

特点:

  • 每个结点有零个或多个子结点;
  • 没有父结点的结点称为根结点;
  • 每一个非根结点有且只有一个父结点;
  • 除了根结点外,每个子结点可以分为多个不相交的子树;

术语:

  • 节点的度:一个节点含有的子树的个数称为该节点的度;
  • 叶节点或终端节点:度为0的节点称为叶节点;
  • 节点深度:对任意节点x,x节点的深度表示为根节点到x节点的路径长度。所以根节点深度为0,第二层节点深度为1,以此类推
  • 节点高度:对任意节点x,叶子节点到x节点的路径长度就是节点x的高度
  • 树的深度:一棵树中节点的最大深度就是树的深度,也称为高度
  • 父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点
  • 子节点:一个节点含有的子树的根节点称为该节点的子节点
  • 节点的层次:从根节点开始,根节点为第一层,根的子节点为第二层,以此类推
  • 兄弟节点:拥有共同父节点的节点互称为兄弟节点
    度:节点的子树数目就是节点的度
  • 祖先:对任意节点x,从根节点到节点x的所有节点都是x的祖先(节点x也是自己的祖先)
  • 后代:对任意节点x,从节点x到叶子节点的所有节点都是x的后代(节点x也是自己的后代)
  • 森林:m颗互不相交的树构成的集合就是森林

2. 二叉树

每个结点至多拥有两棵子树(即二叉树中不存在度大于2的结点),并且,二叉树的子树有左右之分,其次序不能任意颠倒。
性质:

  • 1.若二叉树的层次从0开始,则在二叉树的第i层至多有2^i个结点(i>=0)
  • 2.高度为k的二叉树最多有2^(k+1) - 1个结点(k>=-1)(空树的高度为-1)
  • 3.对任何一棵二叉树,如果其叶子结点(度为0)数为m, 度为2的结点数为n, 则m = n + 1

2.1 二叉树的种类

  • 满二叉树
    叶子节点都在同一层并且除叶子节点外的所有节点都有两个子节点。
    在这里插入图片描述

  • 完全二叉树
    对于一颗二叉树,假设其深度为d(d>1)。除第d层外的所有节点构成满二叉树,且第d层所有节点从左向右连续地紧密排列,这样的二叉树被称为完全二叉树;
    在这里插入图片描述

  • 霍夫曼树
    带权路径最短的二叉树称为哈夫曼树或最优二叉树。

  • 二叉查找树(二叉搜索树、二叉排序树、BST)
    性质:

    • 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
    • 若它的右子树不空,则右子树上所有结点的值均大于或等于它的根结点的值;
    • 它的左、右子树也分别为二叉排序树。
      在这里插入图片描述
  • 平衡二叉树 AVL
    是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树,同时,平衡二叉树必定是二叉搜索树。
    在这里插入图片描述
    使用场景:

    • AVL树适合用于插入删除次数比较少,但查找多的情况。
    • 也在Windows进程地址空间管理中得到了使用
    • 旋转的目的是为了降低树的高度,使其平衡
  • B树/B-树
    一棵m阶B树(balanced tree of order m)是一棵平衡的m路搜索树。
    能够保证数据有序。同时它还保证了在查找、插入、删除等操作时性能都能保持在O(logn),为大块数据的读写操作做了优化,同时它也可以用来描述外部存储(支持对保存在磁盘或者网络上的符号表进行外部查找)
    它或者是空树
    特点:

  • 1.定义任意非叶子结点最多只有M个儿子;且M>2

  • 2.根结点的儿子数为[2, M]

  • 3.除根结点以外的非叶子结点的儿子数为[M/2, M]

  • 4.每个结点存放至少M/2-1(取上整)和至多M-1个关键字;(至少2个关键字)

  • 5.非叶子结点的关键字个数=指向儿子的指针个数-1

  • 6.非叶子结点的关键字:K[1], K[2], …, K[M-1];且K[i] < K[i+1]

  • 7.非叶子结点的指针:P[1], P[2], …, P[M],其中P[1]指向关键字小于K[1]的子树,P[M]指向关键字大于K[M-1]的子树,其它P[i]指向关键字属于(K[i-1], K[i])的子树

  • 8.所有叶子结点位于同一层
    在这里插入图片描述

  • B+树
    B+树是B-树的变体,也是一种多路搜索树
    B+的搜索与B-树也基本相同,区别是B+树只有达到叶子结点才命中(B-树可以在非叶子结点命中),其性能也等价于在关键字全集做一次二分查找
    区别:

    • B+树 有n棵子树的结点中含有n个关键字,每个关键字不保存数据,只用来索引,所有数据都保存在叶子节点;
    • B+树 所有的叶子结点中包含了全部关键字的信息,及指向含这些关键字记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接

特性:

  • 1.所有关键字都出现在叶子结点的链表中(稠密索引),且链表中的关键字恰好是有序的
  • 2.不可能在非叶子结点命中
  • 3.非叶子结点相当于是叶子结点的索引(稀疏索引),叶子结点相当于是存储(关键字)数据的数据层
  • 4.更适合文件索引系统
    原因: 增删文件(节点)时,效率更高,因为B+树的叶子节点包含所有关键字,并以有序的链表结构存储,这样可很好提高增删效率
    在这里插入图片描述

B树:有序数组+平衡多叉树
B+树:有序数组链表+平衡多叉树

  • 红黑树
    红黑树,一种二叉查找树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。
    通过对任何一条从根到叶子的简单路径上各个结点的颜色进行约束,红黑树确保没有一条路径会比其他路径长出2倍,因而是近似于平衡的。

在这里插入图片描述

2.2 二叉树的遍历

  • 中序遍历:即左-根-右遍历,对于给定的二叉树根,寻找其左子树;对于其左子树的根,再去寻找其左子树;递归遍历,直到寻找最左边的节点i,其必然为叶子,然后遍历i的父节点,再遍历i的兄弟节点。随着递归的逐渐出栈,最终完成遍历
  • 先序遍历:即根-左-右遍历
  • 后序遍历:即左-右-根遍历
  • 层次遍历:从根节点依次往下一层一层遍历
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

nsq_ai

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值