树的基础概念

  • 树的基本概念 由N个节点(N>=0)构成的集合
    • 有一个特殊的节点,称为根节点,根节点没有前驱节点
    • 除过根节点外,其余节点别分成M个(M>0)个互不相交 的集合T1、T2…Tn,其中每一个集合又是一棵与树结构类 似的子树
    • 树是递归定义的
  • 名词解释 | 名称 | 含义 | | :—- | :—- | | 结点 | 结点包括一个数据元素及若干指向其他子树的分支(指 针(索引)) | | 结点的度 | 结点所拥有的的子树的个数 | | 度为0的结点 | 又称终端节点 | | 分支结点 | 度不为零的结点 非终端结点 | | 祖先结点 | 从根结点到该结点所经分支上的所有结点 | | 子孙结点 | 以某结点为根结点的子树中的所有结点 | | 双亲结点 | 树中某结点有孩子节点,该结点称为它孩子节点的双亲结 点 | | 孩子结点 | 树中一个结点的子树的根结点称为该结点的孩子结点 | | 兄弟结点 | 具有相同双亲结点的结点 | | 树的度 | 树中所有结点的度的最大值 | | 结点的层次 | 从根结点到树中某结点所经路径上的分支数 | | 树的深度 | 树中所有结点的层次的最大值 | | 有序树 | 树中结点的各棵子树T0,T1…是有序的 | | 无序树 | 树中结点的各棵子树之间的次序不重要,可以相互交换位 置 | | 森林 | 树m棵树的集合 |
  • 树的存储结构
    • 双亲表示法 用指针表示出每个结点的双亲结点
      • 优点 寻找一个结点的双亲结点操作实现很方便
      • 缺点 寻找一个结点的孩子结点很不方便
      • image.png
    • 孩子表示法 用指针指出每个结点的孩子结点
      • 优点 寻找一个结点的孩子结点比较方便
      • 缺点 寻找一个结点的双亲结点很不方便

image.png

  • 双亲孩子表示法
    用指针既表示出每个结点的双亲结点,也表示出每个结点 的孩子结点

image.png

  • 孩子兄弟表示法
    表示出第一个结点的第一个孩子结点,也表示出每个结点 的下一个兄弟结点

image.png

  • 树的应用 电脑的目录

二叉树

  • 概念 一棵二叉树是结点的一个有限集合,该集合或者为空,或 者是由一个根节点加上两棵分别称为左子树和右子树的二 叉树组成
  • 特点

  • 每个结点最多有两棵子树

  • 二叉树的子树有左右之分,其次序不能颠倒

  • 满二叉树 所有分支结点都存在左子树和右子树,并且所有叶子结点 都在同一层上

  • 完全二叉树
    如果一棵具有N个结点的二叉树的结构与满二叉树的前N 个节点的结构相同,称为完全二叉树

树 - 图5

  • 二叉树的性质、
    • 若规定根节点的层次为1,则一棵非空二叉树第i层上最多 有2^(i-1)(i>=1)个结点
    • 若规定只有根节点的二叉树的深度为1,则深度为K的二 叉树的最大结点数是2^k-1(k>=0)
    • 对任何一棵二叉树,如果其叶结点个数为n0,度为2的非 叶结点个数为n2,则有n0=n2+1
    • 具有n个结点的完全二叉树,如果按照从上至下从左到右 的顺序对所有结点从0开始编号,则对于序号为i的结点 有:
      • 如果i>0,则序号为i的结点的双亲结点的序号为(i-1)/2, 如果i==0,则序号为i的结点为根节点,无双亲结点
      • 如果2i+1=n,则序号为i结点无右孩子结点
      • 如果2i+2=n,则序号为i结点无右孩子结点
  • 二叉树的存储结构
    • 顺序存储
      • 优点、 存储完全二叉树,简单省空间
      • 缺点 对一般二叉树尤其单支树,存储空间利用不理想
        树 - 图6
    • 链式存储
      树 - 图7
  • 二叉树的基本操作
    • 二叉树的创建
    • 二叉树的遍历
      • 前序
      • 中序
      • 后序
      • 层序
        • 初始化一个队列
        • 把根节点的指针入队列
        • 当队列非空时循环执行
          • 出队列取一个节点
          • 若该结点的左子树非空,将该节点的左子树指针入队列
          • 若该节点的右子树非空将该节点的右子树入队列
        • 结束

树 - 图8

二叉搜索树

  • 性质
    • 如果左子树不为空,则左子树上所有节点的值都小于根结 点的值
    • 它的右子树不为空,则右子树上所有节点的值都大于根结 点的值
    • 它的左右子树也分别为二叉搜索树

树 - 图9

  • 操作
  • 搜索 若根结点不为空
    • 根结点key==要查找的key,返回true
    • 根结点key>查找key,在其左子树查找
    • 根结点key<查找key,在其右子树查找
    • 否则返回false
  • 插入
    • 首先检测这个节点是不是已经存在,要是存在不插入
    • 否则将元素插入到找到的位置
  • 删除
    • 首先判断是否在树中,没有直接返回
    • 有的情况v
      • 要删除的节点没有孩子节点 直接删除该结点
      • 要删除的节点只有左孩子
        删除该结点并使被删除结点的双亲结点指向被删除结点的 左孩子结点
      • 要删除的节点只有右孩子
        删除该结点并使被删除结点的双亲结点指向被删除结点的 右孩子结点
      • 要删除的节点有左、右孩子结点
        在它的右子树中寻找中序下的第一个结点(关键码最
        小),用它的值填补到被删除节点中,再来处理该结点的 删除问题
  • 二叉搜索树性能分析
    最坏情况下,平均查找长度为O(n)一般情况下平均长度 为O(lgn)

AVL树

  • AVL树性质
    • 它的左右子树都是AVL树
    • 左子树和右子树高度之差(简称平衡因子)的绝对值不超 过1(-1、0、1)
    • 如果一棵树是高度平衡的,它就是AVL树。如果它有n个 节点,其高度可保持在0(lgn),平均搜索复杂度O(lgn)
  • 平衡化旋转
    • 左单旋
    • 右单旋
    • 左右双旋
    • 右左双旋
      树 - 图10
  • AVL树的插入
    • 如果是空树,插入后即为根结点,插入后直接返回true
    • 如果树不空,寻找插入位置,若在查找过程中找到key, 则插入失败直接返回false
    • 插入节点
    • 更新平衡因子,对树进行调整
  • AVL树的删除
    • 被删除结点只有左孩子
      parent的平衡因子为1或者-1,parent高度不变,则从 parent到根所有结点高度均不变,不用调整
    • 被删除结点只有右孩子
      parent的平衡因子变成0,虽然以parent为根的子树平
      衡,其高度减1,但需要检查parent的双亲结点的平衡性
    • 被删除结点左右孩子都有 变为删除中序遍历下的第一个结点q
      结点parent的平衡因子为2或者-2,则较矮子数缩短, parent发生不平衡,需要进行平衡化旋转
    • parent较高子树的根为q
      • 如果q的平衡因子为0,执行单循环恢复parent
      • 如果q的平衡因子与parent平衡因子(正负)号相同,则 执行一个单循环恢复parent
      • 如果q的平衡因子与parent平衡因子(正负)号相反,则 执行一个双旋转恢复parent

红黑树

  • 概念
    红黑树是一棵二叉搜索树,它在每个节点上增加了一个存 储位来表示结点的颜色,保证最长路径不超过最短路径的 两倍,近似平衡
  • 性质
    • 每个结点不是红色就是黑色
    • 树的根结点是黑色
    • 如果一个结点是红色的,则它的两个孩子结点是黑色的(没有连续的两个红色结点)
    • 对于每个节点,从该结点到其所有后代叶节点的简单路径上,均包含相同数目的黑色结点(每条路径上黑色结点的 数量相等)
    • 每个叶子节点都是黑色的(此处的叶子结点指的是空节点)

树 - 图11

  • 插入实现
    • 若树为空,插入后需将新节点改成黑色
    • 插入结点的父节点为黑色,不违反任何性质,直接插入
  • 红黑树和AVL树的比较
    • 二叉搜索树没有自平衡的机制:
      向二叉搜索树中依次插入(1,2,3,4,5,6),二叉搜索树退化成了链表.

树 - 图12

  • 平衡二叉树的定义过于严格
    平衡二叉树的定义过于严格,导致每次插入或者删除一个元素之后,都要去维护二叉树整体的平衡,这样产生额外的代价又太大了
  • 红黑树保证最长路径不超过最短路径的二倍,因而近似平衡。
    树 - 图13

B树

  • 平衡的多叉树
  • 性质
    • 根结点至少有两个孩子
    • 每个非根结点至少有M/2(上取整)个孩子,至多有M个 孩子
    • 每个非根结点至少有M/2-1(上取整)个关键字,并且以 升序排列
    • key[i]和key[i+1]之间的孩子结点的值介于key[i]、key[i+1] 之间
    • 所有的叶子结点都在同一层
  • B+树
    • 性质
      • 其定义基本与B树相同
      • 非叶子节点的子树指针与关键字个数相同
      • 非叶子结点的子树指针P[i],指向关键字值属于[k[i],k[i+ 1])的子树
      • 为所有叶子节点增加一个链指针
      • 所有关键字都在叶子节点出现
    • 搜索 和B树基本相同
    • 特性
      • 所有关键字都出现在叶子节点的链表中(稠密索引),且 链表中的关键字恰好是有序的
      • 不可能在叶子结点命中
      • 非叶子节点相当于是叶子结点的索引(稀疏索引),叶子 结点相当于是存储(关键字)数据的数据层
      • 更适合文件索引系统
  • B*树
    • 在B+树的非根和非叶子结点之间再增加指向兄弟的指针

Huffman树(最优二叉树)

  • 概念
    • 路径
    • 路径长度
    • 把带权路径长度最小的树叫做Huffman树
  • 构造huffman树
    • 构造n棵只有根结点的二叉树森林,每棵二叉树都只有一 个带有权值的根结点
    • 重复以下步骤,直到F中只剩下一棵树
      • 在二叉树森林中选最小的两个,作为左右子树构建一棵新 的二叉树,新二叉树的根结点的权值为左右子树根结点的 权值之和
      • 在原来二叉树森林里删除这两棵二叉树
      • 把新的二叉树加入二叉树森林

image.png

  • huffman编码 编码
    • 在数据通信中经常把传输的文字转换成二进制字符0和1组 成的二进制串,这叫做编码
    • 等长编码
    • 不等长编码
  • 文件压缩