我们总说水是源的,树是有根的。但是,数据结构中的树是可以没有根的。本文旨在搞清树的最基本形式的区别,即一般树、有根树、无根树、有序树、无序树的区别。
一、树的本质特征
树的本质特征就一句话:树是一种无环的连通无向图。
只要满足这个条件,它就是树。
具体来说有3个条件:
- 无向:边没有方向。
- 连通:任意两个节点之间都存在一条路径。连通是图的基本属性。
- 无环:不存在任何闭环。即不存在任何可以从一个节点出发并最终回到该节点的路径,这样的路径被称为环。在无环图中,每条边都连接了两个不同的节点,且没有边会被重复使用来形成一个闭环。
二、无根树、有根树
2.1 无根树
谈到树这种树据结构,大家总会想到根节点、子节点、叶节点,但是,殊不知树其实是可以无根的。而且,无根树才是树的最基本形式。
所谓的无根,就是没有明确的根节点。
任何一颗树其实都可以看成是无根树。
比如下面这颗树:
看到这张图,你肯定想当然地认为它的根节点是最上面的A,这显然犯了经验主义的错误。仅就这张图来说,在别人没告诉你根节点是哪个时,任何一个节点都可视为根节点。
你可以把这张图想象成赵本山小品《牛大叔提干》中的“扯蛋”。
把图中任何一个蛋提拎起来,都能变成根蛋(根节点)。比如把蛋F拎起来,就可以变成下面的树:
这就是无根数。
对于无根树,度的定义变了。因为不知道谁是老祖宗,也就分不清哪个是父亲,哪个是儿子。所以无根数中度不再用孩子的个数定义,而是指一个节点相邻的节点的个数。因此,对无根树来说,叶子是度为1的节点。
2.2 有根树(一般树)
如果指定一个节点作为根节点,无根树就变成了有根树。
虽然无根树是树的最基本形式,但是它没有根,没有层次,就像是无源之水,无本之木,没法研究。
所以有根树才是我们搞研究的树的一般形式,因此有根树也被称为“一般树”。
在编程中,当我们提到“树”这一术语时,如果没有特别指明是无根树,那么通常默认是指有根树(或一般树)。
因为有了根,所有节点间的父子关系就完全确定下来了,树的层次及各种参数(比如高度、度)也就确定下来了。
于是,也就有了这些有根树的特点:
- 每个结点有零个或多个子结点。
- 没有父结点的结点称为根节点。
- 每一个非根结点有且只有一个父结点。
- 除了根节点外,每个子结点可以分为多个不相交的子树。
我们在研究树时,总会把树等同于有根树,说树有这些特点,但是我们也不要忘了,实际上只有有根树才有这些特点。
三、无序树、有序树
3.1 无序树
若树中每个结点的各子树从左到右是没有次序的(即可以互换),则称该树为无序树。无根树就是一种无序树,因为它没有特定的根节点,所以各子树之间没有固定的次序。
特点:无序树的子树可以互换位置,即兄弟节点之间没有顺序关系。
3.2 有序树
若树中每个节点的各子树看成是从左到右有次序的(即不能互换),则称该树为有序树。有根树可以是有序树,因为它的子树之间可以具有固定的次序。
特点:有序树的子树不能互换位置,即兄弟节点之间有顺序关系。比如二叉树就是一种有序树,左子树和右子树是严格区分的。
关于树的更多内容介绍,参见以下文章:
树的定义与相关概念全解析:信息学奥赛“树”知识构成
“树”的简明介绍
“树”的高度的计算——CSP-J1真题详解