「这是我参与2022首次更文挑战的第25天,活动详情查看:2022首次更文挑战」
树 —— 算法世界中最常被提到的数据结构
树世界起源概念
节点【 数据元素 + 若干指向子树的分支信息 】节点的度(子树的个数)树的度(所有节点中最大的度数)终端节点(叶子 🍃 节点)分支节点(度大于0 —— 即非叶子)内部节点(非根 && 非叶子)节点的层次(根为第一层,依次+1)树的深度- 别名:树的高度
- 所有节点中
最大的层数
路径(两个节点间所经过的节点序列)路径长度(两个节点间路径上经过的边数)
树世界的成员
孩子【 节点子树的根 】—— 该节点为孩子的双亲兄弟【 双亲相同 】- 堂兄弟【 双亲是兄弟的节点 】
- 祖先【 从根到当前节点所经过的所有节点 】
- 子孙【 节点的子树中所有的节点 】
- 有序树【 节点的子树从左到右排序 】
- 无序树【 节点子树的位置不限 】
森林【 集合 —— n 棵不想交的树 】
树形结构
一对多关系【 前驱(根无前驱) + 节点 + 后继(叶子无后继)】- 数据存储
顺序存储- 双亲表示法(数据域data + 双亲域parent —— -1表示不存在 、 0表示根的索引下标)
- 不足:无法直接找到其孩子节点
- 孩子表示法(数据域 + 所有孩子的存储位置下标)
- 不足:浪费空间
- 双亲孩子表示法(双亲法 + 孩子法)
- 可以快速找到双亲和孩子
- 不足:浪费空间
- 双亲表示法(数据域data + 双亲域parent —— -1表示不存在 、 0表示根的索引下标)
链式存储- 孩子链表表示法
- 采用邻接表的思路
- 节点的所有孩子都存储在一个单链表中
- 表头(data + first)
- 节点(当前节点下标 + 下一节点下标)
- 孩子兄弟表示法
- 采用二叉链表的思路
左孩子 + 右兄弟- 节点(lchild + data + rchild)—— 二叉链表
- 孩子链表表示法
树世界的变化
- 树 <--> 二叉树
- 转换方案:
左孩子——长子 + 兄弟右移
- 转换方案:
- 森林 <--> 二叉树
- 转换方案:
右兄弟——森林中每棵树的树根
- 转换方案:
二叉树
- 略(前面的文章有涉及,不再赘述)
序列还原树世界
- 二叉树还原
先序遍历 + 中序遍历- 先序序列的第一个字符为根
- 中序序列中 【 左子树 + /根/ + 右子树】
- 继续还原左右子树
- 还原得到唯一的二叉树
中序遍历 + 后序遍历- 后序序列最后一个字符为根
- 同上
- 树还原
先还原为二叉树继续还原- 先根遍历 or 后根遍历
- 森林还原 -同上
结
- 多元变化的树世界总是那么地奇妙
- 树世界的冒险之旅总会带来意想不到的收获