摘自计蒜客:http://www.jisuanke.com/course/35/1387
树形结构广泛存在我们的现实生活里,下面两张图你一定不陌生吧,第一张是 Linux 文件系统结构,第二张是美国福特汽车公司的汽车家谱图。类似的树形结构还有很多,他们都可以抽象成数据结构里的树。和自然界里的树有所类似又有所不同,他们都有且仅有一个树根,树上的元素都是从树根衍生出来的。不同的是自然界里的树,它的树根在下面,而数据结构里的树,树根在上面。
下面我们利用第一个例子来介绍几个和树相关的概念。
树是由若干个有限结点组成的一个具有层次关系的集合,每棵树有且仅有一个根,比如在图中,最上面的结点就是树的根结点。例子里的“/”、“etc”、“usr”、“lib”等等都是这棵树上的结点,其中“/”是树的根结点。
图中某个结点及其下面的所有结点并称为以该结点为根的子树,例如“usr”、“lib”、“bin”就是“/”的一棵子树,“usr”是该子树的根。结点拥有的子树个数我们称为结点的度,比如结点“/”的度为 7,“home”的度为 3。在例子中,我们称“usr”是“lib”、“bin”的父亲,“lib”、“bin”是“usr”的孩子。没有孩子的结点,也就是度为 0 的结点我们称为叶子,例如“etc”、“lib”、“bin”都是叶子结点。
我们规定根结点是树的第一层,树根的孩子结点是树的第二层,以此类推,树的深度就是结点的最大层数,例如例子里的树,它的深度为 4。
下面我们用第二个例子简单复习下这几个概念,从图上,我们可以看到这是一棵以“美国福特汽车公司”为根结点,深度为 3 的树;“马自达”、“俊郎”是以“美国福特汽车公司”为根结点的一棵子树;“美国福特汽车公司”度为 8,“路虎”度为 0;“美国福特汽车公司”是“阿斯顿马丁”、“路虎”、“捷豹”等的父亲,“阿斯顿马丁”、“路虎”、“捷豹”是“美国福特汽车公司”的孩子;“路虎”、“野马”、“雷鸟”等都是树的叶子结点。
通过这两个例子的学习,我们可以发现树的一些性质:
每棵树有且仅有一个根结点;
在树上,从一个结点出发可以访问到其余的结点,并且一个结点到另一个结点的路径有且仅有一条;
父亲结点可以有多个孩子结点,除根结点外,其余的结点有且仅有一个父亲结点;
根结点没有父亲结点,叶子结点没有孩子结点。