树的定义和性质

来源:互联网 发布:汽车app软件下载 编辑:程序博客网 时间:2024/04/20 21:19

树是很重要的一种数据结构。在算法上它有递归和非递归处理,在现实上可以和栈、队列相结合。此外还应用在多种场合,比如排序、查找。

在逻辑上,它不同于顺序表的一对一、图的多对多,树是一个对象对应对个对象的数据结构。

树的存储方式可以有链式存储,可以有线性存储。大部分的操作使用的是链式存储,但在和堆、排序相关的情况下用的是线性存储。

树的表示方式很多,在项目中最常见到的树形表示、括号表示,比如:A(B,C(D,E,F),G,H)

树是节点和关系的集合,所以可以是空。空的情况下树的高度定义=0。下面考虑非空的树。

构成树的元素有结点和分支。有几个用的比较多的术语:

1.结点的度:节点的分支数,比如上面的A结点,它有4个分支,那么A的度是4

2.树的度:因为树通常由多个结点构成,每个结点都有它的度,那么取度数的最大值作为这个树的度,也就是 树的度 = max (构成它的结点的度)。如果一个树的度是4,像上面的那个demo,那么我们叫它4叉树。通常二叉树是用的最多的,三叉树也会用到。

3.根结点:处在最顶端的结点是根结点,没有任何结点指向根结点

4.第i层:树丛跟结点开始,由上往下分别是第1层,第2层。。。

5.树的高度:能够达到的最大层数。上面的demo高度是3

6.路径:就是一个树上经过某些结点的路径,比如上面的demo中,我要去到E结点,就必须从A-C-E,那么A-C-E就是一条路径


oright,现在看下树的几个性质。对于理解树很有帮助

1.一棵树的结点总数 = 分支树 +1;二叉树情况下,叶子结点数目 比 度是2的所有结点数总和 多 1

因为一个分支对于一个结点,而根结点灭有分支和它对于,漏掉了根结点,所以+1就是树的总结点数

二叉树情况下,结点的分支树只可能是0(叶子)、1、2。根据一般的情况下列出等式,处理下就是二叉树情况下的结论

2.一个m叉树,它在第k层最多有pow(m, k-1)个结点,最少有1个结点(否则它的高度只能是k-1);如果是二叉树情况下它的第k层最多有pow(2,k-1)个结点,最少还是1个

什么情况下达到最多,当且从根结点开始的所有结点度都是m,那么第二层有m个节点,第三层有m*m个。。。到了第k层就是pow(m, k-1)个

3.一个m叉树,如果它的高度是h,那么它最多有(pow(m,h) - 1) / (m -1)个结点,最少有h-1+m个结点;如果是二叉树的话它最多有pow(2,h)-1 个结点,最少有h+1个结点

跟性质2的逻辑相同,要实现最多的结点树一定是是满的情况,也就是从根结点开始的所有结点度都是m,那么第二层有m个节点,第三层有m*m个。。。到了第h层就是pow(m, h-1)个。这样构成了公比是m等比数列,请个前h项之后就是了。

最少的情况是这些结点中只有一个结点的度是m,其他的不是0就是1。假设h-1层的度都是1的话,这时候有h-1个结点,然后因为它是m叉树,在h层一定得有m个结点,所以就是h-1+m个

4.一个m叉树,有n个结点,它的高度最小是ln(m(n-1)+1) / ln(m)

这个可以从性质2和3推导出来,推导的方式就是等比数列前k项和与不等式,这里就不写了,more details可以参考教材《李春葆数据结构第二版》(俺们大二的教科书,可是本人为了省钱只搞了个复印版,结果后悔至今。。。呜呜呜)

5. 跟完全二叉树的顺序存储有关的一条性质。树的顺序存储,下标编号从1开始,也就是根结点标号是1,它的左孩子是2,右孩子是3。。。那么如果一个编号是i的结点,它的左孩子的下表是2i(如果有),右孩子是2i+1(如果有);反过来如果一个编号是i的结点,树总共有n个结点。那么的它的父结点的编号要么是i/2,要么是(i-1) /2,哪个是整数就是哪个个。比如第6个结点的父节点的编号是6/2=3,编号是7的父节点是7-1=6/2=3。在堆排序的实现里面依赖的就是一个堆,说白了就是一个顺序存储的完全二叉树。排序的实现跟这条性质关系密切呃






0 0