树之奇妙世界

158 阅读2分钟

「这是我参与2022首次更文挑战的第25天,活动详情查看:2022首次更文挑战

树 —— 算法世界中最常被提到的数据结构

树世界起源概念

  • 节点【 数据元素 + 若干指向子树的分支信息 】
    • 节点的度(子树的个数)
    • 树的度(所有节点中最大的度数)
    • 终端节点(叶子 🍃 节点)
    • 分支节点(度大于0 —— 即非叶子)
    • 内部节点(非根 && 非叶子)
    • 节点的层次(根为第一层,依次+1)
    • 树的深度
      • 别名:树的高度
      • 所有节点中最大的层数
  • 路径(两个节点间所经过的节点序列)
    • 路径长度(两个节点间路径上经过的边数)

树世界的成员

  • 孩子【 节点子树的根 】—— 该节点为孩子的双亲
  • 兄弟【 双亲相同 】
  • 堂兄弟【 双亲是兄弟的节点 】
  • 祖先【 从根到当前节点所经过的所有节点 】
  • 子孙【 节点的子树中所有的节点 】
  • 有序树【 节点的子树从左到右排序 】
  • 无序树【 节点子树的位置不限 】
  • 森林【 集合 —— n 棵不想交的树 】

树形结构

  • 一对多关系【 前驱(根无前驱) + 节点 + 后继(叶子无后继)】
  • 数据存储
    • 顺序存储
      • 双亲表示法(数据域data + 双亲域parent —— -1表示不存在 、 0表示根的索引下标)
        • 不足:无法直接找到其孩子节点
      • 孩子表示法(数据域 + 所有孩子的存储位置下标)
        • 不足:浪费空间
      • 双亲孩子表示法(双亲法 + 孩子法)
        • 可以快速找到双亲和孩子
        • 不足:浪费空间
    • 链式存储
      • 孩子链表表示法
        • 采用邻接表的思路
        • 节点的所有孩子都存储在一个单链表中
        • 表头(data + first)
        • 节点(当前节点下标 + 下一节点下标)
      • 孩子兄弟表示法
        • 采用二叉链表的思路
        • 左孩子 + 右兄弟
        • 节点(lchild + data + rchild)—— 二叉链表

树世界的变化

  • 树 <--> 二叉树
    • 转换方案:左孩子——长子 + 兄弟右移
  • 森林 <--> 二叉树
    • 转换方案:右兄弟——森林中每棵树的树根

二叉树

  • 略(前面的文章有涉及,不再赘述)

序列还原树世界

  • 二叉树还原
    • 先序遍历 + 中序遍历
      • 先序序列的第一个字符为根
      • 中序序列中 【 左子树 + /根/ + 右子树】
      • 继续还原左右子树
      • 还原得到唯一的二叉树
    • 中序遍历 + 后序遍历
      • 后序序列最后一个字符为根
      • 同上
  • 树还原
    • 先还原为二叉树
    • 继续还原
    • 先根遍历 or 后根遍历
  • 森林还原 -同上

  • 多元变化的树世界总是那么地奇妙
  • 树世界的冒险之旅总会带来意想不到的收获

快快开启你的树世界之奇妙之旅吧