java算法:树
树是一种数学抽象,它在算法设计和分析中起着重要的作用:使用树来描述算法的动态特性,构建和使用明确的数据结构是树的具体实现。
在计算机应用中,树结构的一种最熟悉的应用是用来组织文件系统。
树的类型:树,有根的树,有序树,M叉树和二叉树。
二叉树是特殊类型的有序树,有序树是特殊类型的有根树,而有根树又是特殊类型的树。不同类型的树自然出现在不同的应用中。
二叉树是一个外部结点或者连接到一对二叉树的内部结点,那对二叉树称为那个结点的左子树和右子树。
- class Node{
- Item item;
- Node l;
- Node r;
- Node(Item item, Node l, Node r){
- this.item = item;
- this.l = l;
- this.r = r;
- }
- }
表示沿着树向下移动的操作,但不能有效实现要求从孩子移到双亲的操作,可以在每个结点增加第三个指针,指向双亲。
一棵M叉树或者一个外部结点,或者连接到M棵树的有序序列的内部结点。
通常把M叉树中的结点表示为具有M个命名指针的结构,或具有M个指针的数组。
一棵树(有序树)是一个连到一序列不相交树的结点,这样的一种树序列称为森林。
有序树和M叉树之间的区别在于有序树中的结点可有任何数目的孩子,而M叉树中的结点必须有M个孩子。
由于有序树中的每个结点都有任何数目的指针,所以使用链表。每个结点包含两个指针,指向兄弟的链表和孩子的链表。
在二叉树和有序森林之间存在一对一的对应。
一棵有根树(无序树)是连到一个多集合的有根树的一个结点(根),这个的一个多集合称为无序森林。
图是由一个顶点集和一边集构成的,边连接了不同结点对。
每一棵树都是一幅图,如果G有N-1条边且没有回路,且是连通的,G中每一对顶点正好有一条简单路径把它们连起来,G是连通的,但如果删除任一条边,则它不是连通的,就是树。
在研究算法的时候,考虑树的一些基本性质,是很有必要的。
java算法:二叉树
在算法设计中,二叉树是比较频繁使用的,理解好它的性质,二叉树也是一种数据结构。
有N个内部结点的二叉树有N+1个外部结点。
证明:二叉树没有内部结点,N = 0, 外部结点为1,成立。当N > 0,任何有N个内部结点的二叉树,左子树有k个内部结点,右子树有N - K - 1个内部结点,k 在 0 与 N - 1之间, 因为根是内部结点,通过假设,左子树有k + 1个结点,右子树有N - k个外部结点,总共有 N + 1个外部结点。
有N个内部结点的二叉树有2N个指针:N-1个指针指向内部结点,N+1个指针指向外部结点。
在任何有根树中,除了跟之外,每个结点都有唯一的双亲,每条边都把一个结点连接到它的双亲结点上,所以连接内部结点的指针有N-1个。类似的,N+1个外部结点中的每一个都有一个指针,指向它唯一的双亲。
树中一个结点的层次比它的双亲结点的层次要高一层(根在0层)。树的高度是树中结点层次的最大值。树的路径长度是树中所有结点层次之和。二叉树的内部路径长度是树中所有内部结点的层次之和。二叉树的外部路径长度是树中所有外部结点的层次之和。
计算树的路径长度的一个快捷方法是对多所有的k,对k与层次k上的结点树之积求和。
对于很多递归计算,对应树的高度就是递归的最大深度,或者支持计算所需要的栈的大小。
具有N个内部结点的任何二叉树的外部路径长度比内部路径长度大2N。
具有N个内部结点的二叉树的高度至少是lgN,至多是N-1。
最坏的情况只有一个叶子的退化树,从根到这个叶子有N-1个指针。最好的情况是一棵平衡树,在每一层i上都具
有2的i次方个内部结点(除了低层之外),如果高度是h,则必须有:
2h-1<N+1<2h
这个等式说明:最好情况下的高度刚好等于对lgN四舍五入得到的最近的整数值。
具有N个内部结点的二叉树的内部路径长度至少是Nlg(N/4),至多是N(N-1)/2。
二叉树广泛的应用在计算机中,当二叉树完全平衡时,性能是最好的。
注意:内部结点,外部结点;根,叶子;双亲,结点,孩子,兄弟,叶子。