编程基础 - 树与森林 (Tree and Forest)
本文将介绍线索树与森林的基础知识,并用C++实现它。
在查看本文之前,需要一些数据结构和程序语言的基础。
其中的方法还需要熟悉“栈(stack)”、“队列(queue)”和“递归”。
文章目录
1 树与森林的简述 (Introduction)
-
树是由 n ( n ≥ 0 ) n (n \ge 0) n(n≥0) 个结点组成的 有穷 集合。在任意一棵非空树中:
- 每一个元素,称为结点(Node);
- 有一个特定的结点,称为根(Root);
- 除根结点以外,其它结点被划分成 m ( m ≥ 0 ) m (m \ge 0) m(m≥0) 个不相交的有限集合,每个集合也是一棵树,称为根的子树(SubTree)
-
树的特点:
- 分层结构;
- 递归结构;
- 子树的根结点有且仅有一个直接前驱,但可以有0或多个直接后继。
-
一些术语:
- 结点:树的数据元素;
- 结点的度:结点下的子树个数(分支);
- 结点的层次:从根结点到该结点的层数;
- 终端结点(叶结点):度为0的结点;
- 分支结点(内部结点):度不为0的结点;
- 树的度:所有结点度中的最大值;
- 树的深度(高度):结点的最大层数(深度从根开始到最下层叶结点,高度从最下层叶结点开始到根);
- 根:即根结点
- 双亲结点(父结点):结点的直接前驱;
- 孩子结点(子结点):结点的直接后继(一棵树含有子树,子树根结点称为树根的孩子);
- 兄弟结点:具有相同父结点;
- 堂兄弟结点:双亲在同一层的结点;
- 祖先:从根到该结点所经分支的所有结点;
- 子孙:该结点下层子树中的任一结点;
- 森林: m m m 棵不相交的树的集合;
- 有序树:结点子树从左到右有序,且不能互换;
- 无序树:结点子树可以互换位置。
2 树的结构 (Tree Structure)
-
等长指针
设置等长的结点,每个结点包含的指针个数相等,等于树的度。
这保证了结点有足够的指针指向它的所有子女结点。但可能会产生许多空指针,造成存储浪费。 -
子女——兄弟表示
// 树,子女——兄弟表示结点 template<typename T> class TreeNode { public: T element; // 数据 TreeNode<T>* firstChild; // 首个孩子(最左端) TreeNode<T>* sibling; // 兄弟结点 TreeNode(const T& e) { element = e; firstChild = 0; sibling = 0; } ~TreeNode() { delete firstChild; firstChild = 0; delete sibling; sibling = 0; } };
树的结构:
树的关系: