六、树和二叉树--(0)什么是树
2016-05-02 21:56
316 查看
摘自计蒜客: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;“美国福特汽车公司”是“阿斯顿马丁”、“路虎”、“捷豹”等的父亲,“阿斯顿马丁”、“路虎”、“捷豹”是“美国福特汽车公司”的孩子;“路虎”、“野马”、“雷鸟”等都是树的叶子结点。
通过这两个例子的学习,我们可以发现树的一些性质:
每棵树有且仅有一个根结点;
在树上,从一个结点出发可以访问到其余的结点,并且一个结点到另一个结点的路径有且仅有一条;
父亲结点可以有多个孩子结点,除根结点外,其余的结点有且仅有一个父亲结点;
根结点没有父亲结点,叶子结点没有孩子结点。
树形结构广泛存在我们的现实生活里,下面两张图你一定不陌生吧,第一张是
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;“美国福特汽车公司”是“阿斯顿马丁”、“路虎”、“捷豹”等的父亲,“阿斯顿马丁”、“路虎”、“捷豹”是“美国福特汽车公司”的孩子;“路虎”、“野马”、“雷鸟”等都是树的叶子结点。
通过这两个例子的学习,我们可以发现树的一些性质:
每棵树有且仅有一个根结点;
在树上,从一个结点出发可以访问到其余的结点,并且一个结点到另一个结点的路径有且仅有一条;
父亲结点可以有多个孩子结点,除根结点外,其余的结点有且仅有一个父亲结点;
根结点没有父亲结点,叶子结点没有孩子结点。
相关文章推荐
- ABP中动态WebAPI原理解析
- 【Unity】11.2 刚体(Rigidbody)
- 顺序表的基本操作
- leetcode 283---Move Zeroes&&对vector erase()和remove用法的感悟
- Error running app: Instant Run requires 'Tools | Android | Enable ADB integration' to be enable
- 一起talk C栗子吧(第一百四十五回:C语言实例--socket概述)
- 使用特定analyzer分析文本
- centos 下用shell脚本启动jar包
- laravel5.2 多表验证
- PyQt5教程——布局管理(4)
- Hadoop HDFS概念学习系列之两个和HDFS读写操作最为密切的Hadoop包(二十)
- 利用docker安装gitlab
- 汇编语言第十三章-int中断
- 百练+dp or DFS+dp就是记忆化搜索,加个数组记忆
- chrome源码分析1:content模型
- Java中多态的实现机制
- android 小技巧
- windows 下VS2015配置opencv
- 深入了解viewport和px
- 堆排序--采用快速排序(利用大堆实现升序,小堆实现降序)