[数据结构笔记]树
1.树的直观理解
客观世界中有许多事物都可以用树这一结构来表示,举个栗子,中国下分有省份,省份下分有市,市下分有县、乡、镇等等,又比如电脑中存储的文件分为C、D等盘还会下分有许多的文件夹。
分层次组织在管理上具有更高的效率。数据管理的基本操作之一就是查找,查找分为两类:静态查找(集合中的记录是固定不变的)和动态查找(集合中的记录是动态变化的)。
其中,静态查找常见的做法是将数据存放到数组或链表中,再按顺序查找,顺序查找并不高效,顺序查找的时间复杂度为O(n),运气好第一个就能找到,但运气不好时可能最后一个才是,平均n/2次,也就是说1000万数据的时候平均需要500万次查找。当然我们还是有别的方法的,比如二分查找算法,其时间复杂度为O(log n),但二分查找算法要求数据元素的关键字是有序连续存放的。在这里可以引出二分查找判定树的概念,描述折半查找过程的二叉树为判定树。判定树首先是一个二叉排序树,具有n个结点的判定树,与具有n个结点的完全二叉树的深度完全相同。
图 二分查找判定树示意图
二分查找树的查找次数最多不超过它的深度,n个结点的判定树深度为[log2n]+1。查找树中数据的插入和删除操作相较于数组方便许多,也就是说查找树可以很好地解决动态查找的问题,这是它的优点之一。
2.树的定义
树(Tree):n(n≥0)个结点构成的集合。当n=0时称为空树,对于一棵非空树而言,具备以下的性质:
①有一个特殊结点“根”(root),用r来表示
②其余结点可以分为m(m>0)个互不相交的有限集Ti(i=1~m),其中每个集合本身又是一棵树,称为原来树的“子树”(subtree)

图 树的判断
上图中所展示的都不是树,因为树需要可以将根以外的结点分成互不相交的子树,显然这三种情况都不满足互不相交的条件。
思考题:如果有m棵树一共k条边,那么一共有几个结点?思路如下:加一个根节点和m条边把m棵树作为子树,那么这棵树就有m+k条边,一共m+k+1个结点,把根节点去掉那么答案就是m+k个结点。
3.树的基本术语
①结点的度(degree):结点的子树个数
②树的度:所有结点中最大的度
③叶结点(leaf):度为0的结点(没有子树的结点)
④父节点(parent):有子树的结点为其子树的根节点的父节点
⑤子节点(child):若A结点是B结点的父节点,则称B结点是A结点的子节点
⑥兄弟结点(sibling):具有同一父节点的各个结点成为兄弟节点
⑦路径与路径长度:从结点n1到结点nk的路径为一结点序列n1,n2,n3,...,nk,其中ni为ni+1的父节点。路径所包含的结点个数就称为路径长度
⑧结点的层次(level):规定根节点在一层。任意结点的层数为其父结点的层数加一
⑨树的深度(depth):树中所有的结点最大层次
4.树的表示
最先考虑到的是数组,但数组并不容易看出数据之间的相互关系;其次还会考虑到链表,但如果树的结构复杂,父结点的子结点个数不一样会给实现带来一定的困难。
那么我们可以考虑如下的儿子--兄弟表示方法:

图 儿子--兄弟表示法

图 旋转示意图

图 将一般的树看作二叉树示意图
旋转一定角度之后会发现可以看作是每个父节点最多有两个子节点的二叉树(度为2的树),故可以考虑用二叉树链表来表示,那么研究树的重点就在于研究二叉树了。
浙公网安备 33010602011771号