树与树的表示
1:什么是树?
在客观世界中许多事物存在层次关系,比如想要表示人类社会家谱,社会组织结构等(层次关系)时,常用树。
这种层次关系就是树。
2:为什么要在这些管理中采用树?
因为分层次组织在管理上具有更高的效率。
3:介绍数据管理的基本操作之一:查找
如何实现有效率的查找?
查找:给定一个关键字K在某个集合R中找到与K相同的路径。
查找分为两部分静态查找和动态查找。
其中静态查找不涉及插入和删除,只是查找。它的记录是固定的。
而动态查找会可能包含插入和删除。记录是动态变化的。
4-1:操作:
对于静态查找,可以把集合先放入数组中,进行顺序查找。
在数组外设置一个新的结构,包含头部和下方数字10,其中头部可以指向数组中的元素,而数字10则代表了在数组中放了多少个元素。
放置是从1号开始。
这里引入一个技巧,叫做哨兵。
哨兵是在数组中进行循环时,每次循环都对数组边界进行判断的一个东西。
哨兵的作用是在数组的最后或者边界设置一个值,使其不需要每次判断下标是否达到边界,只要按照循环的一般原则,碰到设置的那个值就可以退出来了。
哨兵就可以省去一个判断语句“i>0”。
等于k的情况,可以是数组中任意一个,也可以数组中不存在,在该情况下,k一定存在于下标为0的地方。
这种方法的时间复杂度是O(n)。
4-2:二分查找(binary search)
对于二分查找的概念,可以用生活中的一个场景来描述,假定有一组数,并且它们按照一定的顺序排列好。
此时我们要寻找到“444”这个数,如果使用顺序查找会很浪费时间也很低效。
二分查找的定义是,先找到这一组数最中间的那个数,与要寻找的数进行大小比较,如果比目标数要小就在前半段中寻找,大则反之,不停的进行这个过程,直到找到为止。(过程如下)
二分查找使用条件如下:
4-2:二分查找算法
因为元素的放置是在下标为1的地方,所以left=1。
判断,当left小于等于rigth的时候说明这个范围内有元素存在。
「在二分查找的程序实现中,如果left和right的更新不是取mid+1和mid-1而是都取mid,程序不是正确的。」
二分查找算法的时间复杂度为O(logN)
因为它每次都会把查询的范围减到原先的一半,所以是一种对数的关系。
5:通过二分查找来理解树。
这里的深度表示层数,如6是第一层,3和9是第二层,以此类推。
ASL表示成功查找次数。
6:树的定义
树:n(大于等于0)个结点构成的有限集合。
当n=0时,称为空树。
对于任一棵非空树(n>0),它具备以下性质:
图解如下
7:树与非树
子树不能相交。
除了根结点外,每个结点有且只有一个父结点。
一棵N个结点的树有n-1个边。
问:有一个m棵树的集合(也叫森林)共有k条边,问这m颗树共有多少个结点?
答:一棵树的结点比边要多1,总共有k条边,m棵树,所以总结点为K+m*1=K+M。
8:树的表示
用数组来实现比较困难,关系比较难观察。
可以用链表来表示。
可以把每个结点设置成一样的结构,结构统一时处理起来会比较方便。(但也比较浪费)
可以用一种叫做“儿子-兄弟表示法”
可以看出结构统一且空间浪费不大。
二叉树:是指树中节点的度不大于2的有序树,它是一种最简单且最重要的树。二叉树的递归定义为:二叉树是一棵空树,或者是一棵由一个根节点和两棵互不相交的,分别称作根的左子树和右子树组成的非空树;左子树和右子树又同样都是二叉树 。
附:一棵度为 m的树有n个节点。若每个节点直接用m个链指向相应的儿子,则表示这个树所需要的总空间是n*(m+1) (假定每个链以及表示节点的数据域都是一个单位空间).。当采用儿子/兄弟(First Child/Next Sibling)表示法时,所需的总空间是:3n