zoukankan      html  css  js  c++  java
  • 树-概念性总结及代码示例

    总览:

    • 树的基本概念
    • 二叉树
    • 树和森林
    • 树与二叉树的应用
    1. 树的基本概念
      1. 树的定义:若干结点的集合,有唯一根结点,无环,结点个数可为0
      2. 树的基本术语:
        1. 结点的度:结点拥有的子树个数或者分支的个数
        2. 树的度:结点的度的最大值
        3. 叶子结点:终端结点
        4. 非终端结点:分支结点
        5. 树的深度:树中结点的最大层次数
        6. 结点的深度:从根结点到该结点路径上结点的个数
        7. 结点的高度:子树的深度
        8. 有序树与无序树
        9. 丰满树:理想平衡树,除最底层外其他都是满的
        10. 森林
      3. 树的存储结构
        1. 顺序存储结构
        2. 链式存储结构
          1. 孩子存储结构
          2. 孩子兄弟存储结构
    2. 二叉树
      1. 二叉树的定义
        1. 满二叉树:所有分支结点都有左儿子和右儿子,并且叶子结点都集中在最下一层
        2. 完全二叉树:除最后一层是满二叉树
      2. 二叉树的主要性质(教材P123)
        1. 在二叉树的第i层上之多有2^(i-1)个结点
        2. 深度为k的二叉树至多有(2^k)– 1个结点
        3. 对任何一颗二叉树T,如果其终端结点数为N0,度为2的结点数为N2,则N0 = N2 + 1
        4. 具有n个结点的完全二叉树的深度为[log2n] + 1 (向下取整)
        5. 如果一颗有n个结点的完全二叉树的结点按层序编号,则对任一结点i(1 <= I <= n),有
          1. 如果i=1,则结点i是二叉树的根,无双亲;如果i>1,则其双亲PARENT(i)是结点[i/2](向下取整)
          2. 如果2i > n,则结点i无左孩子(结点i为叶子结点);否则其左孩子LCHILD(i)是结点2i
          3. 如果2i + 1 > n,则结点i无右孩子;否则其右孩子RCHILD(i)是结点2i + 1
      3. 二叉树的存储结构
        1. 顺序存储结构:仅适用于完全二叉树,对于一般的二叉树会浪费大量存储空间
        2. 链式存储结构:最简单的存储结构 (左孩子,数据域,右孩子)
      4. 二叉树的遍历算法
        1. 先序遍历
        2. 中序遍历
        3. 后序遍历
      5. 二叉树遍历算法的改进
        1. 非递归实现:通过栈模拟递归的实现
        2. 线索二叉树:利用树中的空指针域记录结点的前驱
    3. 树和森林与二叉树的相互转换
      1. à 二叉树:右兄弟变右儿子
      2. 二叉树 à 树:右儿子变右兄弟
      3. 森林 à 二叉树:每棵树先转化为二叉树,然后从后往前将该树变为前一棵树的右儿子,直到变成一棵二叉树
      4. 二叉树 à 森林:砍右儿子,变成树
      5. 树和森林的遍历
        1. 先序遍历
        2. 后序遍历
    4. 树与二叉树的应用
      1. 二叉排序树与二叉平衡树
      2. 哈夫曼树和哈夫曼编码
        1. 相关概念:
          1. 路径:指从树的一个结点到另一个结点的分支所构成的路径。
          2. 路径长度:指路径上的分支数目。
          3. 树的路径长度:指从根到每个结点的路径长度之和。
          4. 带权路径长度:结点具有权值,从该结点到根之间的路径长度乘结点的权值,就是该结点的带权路径长度
          5. 树的带权路径长度(WPL):树中所有叶子结点的带权路径长度之和
        2. 构造方法:
          1. 将这n个权值跟别看成只有根节点的n棵二叉树,这些二叉树构成的集合记为F。
          2. 从集合F中取出权值最小的两个结点a,b构成一颗新的二叉树c,新二叉树的根节点的权值为其子结点的权值之和。
          3. 删去a,b,加入新构造的树c
          4. 重复2,3,直到F中只剩下一棵树位为止,这棵树就是哈夫曼树
        3. 哈夫曼树的特点:
          1. 权值越大的结点,距离根节点越近
          2. 树中没有度为1的结点。
          3. 树的带权路径长度最短。
        4. 哈夫曼编码
          1. 前缀码:任一字符的编码串都不是另一个字符编码串的前缀
          2. 哈夫曼编码产生最短的前缀码
        5. 哈夫曼n叉树
          1. 无法构造时补0
  • 相关阅读:
    华为部分真机调试无法显示log问题解决
    Android Studio 配置模拟器AVD存放路径(默认在c盘,解决c盘空间不够问题)
    Android Studio Build APK没有报错,但是Generate signed apk报错
    安卓如何将TXT文件写到特定路径
    unity 显示、隐藏Android导航栏
    Unity 代码集锦之图片处理
    打开文件夹
    MVC总结
    unity 获取UGUI中的Text字的坐标
    Unity WWW类调用http
  • 原文地址:https://www.cnblogs.com/stormax/p/9279596.html
Copyright © 2011-2022 走看看