注:树的定义是递归原理的定义,也就是树种还有子树,那么到底什么是递归呢?
程序调用自身的编程技巧称为递归( recursion),在数学函数中在函数自身又调用自身的类似的解决问题的方法就称为递归原理。
1.树
树是有n个节点的有限集合。
(1)在一棵任意非空树种,有且只有一个节点为根节点。
(2)当n>1时,其余节点可以分为n个互不相交的有限集合,且每一个集合又构成树,成为根节点的子树。
树的四种表示方法:树形表示法、文氏图表法、凸入图表法、广义表表示法。
2.二叉树
条件:最多只有两个分支,包括空树,所以有五个形态。
二叉树的度、深度和层次是不同个概念:度是树的概念,树的度就是节点的分支数(取其最大值);层次,根节点为0层;深度,层次加1.
二叉树的性质:
(1) 在二叉树中,第i层的结点总数不超过2^(i-1);
(2) 深度为h的二叉树最多有2^h-1个结点(h>=1),最少有h个结点;
(3) 对于任意一棵二叉树,如果其叶结点数为N0,而度数为2的结点总数为N2,则N0=N2+1;
性质1、2的证明简单省去,性质三的证明提示:叶子节点即为0度的节点,设度数为1的节点为N1
设整个树的节点总数为N,分支数位E,显然E和N的关系是:N-E=1;
那么有如下关系:节点总数:N=N0+N1+N2
分支总数:E=N1+2N2
由以上三个表达式得:NO=N2-1.
(4) 具有n个结点的完全二叉树的深度为int(log2n)+1
证明:由第二个性质,可以求出深度h。
(5)有N个结点的完全二叉树各结点如果用顺序方式存储,则结点之间有如下关系:
若I为结点编号则 如果I<>1,则其父结点的编号为I/2;
如果2*I<=N,则其左儿子(即左子树的根结点)的编号为2*I;若2*I>N,则无左儿子;
如果2*I+1<=N,则其右儿子的结点编号为2*I+1;若2*I+1>N,则无右儿子。
(6)给定N个节点,能构成h(N)种不同的二叉树。
h(N)为卡特兰数的第N项。h(n)=C(n,2*n)/(n+1)。
(7)设有i个枝点,I为所有枝点的道路长度总和,J为叶的道路长度总和J=I+2i
3.二叉树的遍历:目的是访问二叉树中的所有节点,并且只访问一次,由于二叉树层次结构的特征,有根,左子树,右子树,这里面以根的遍历顺序为基准,有如下三种遍历方法:
(1)先序遍历二叉树:
若二叉树为空,则为空操作,否则
访问根节点,先序遍历左子树,先序遍历右子树。
(2)中序遍历二叉树:
.....
(3)后序遍历二叉树:
.....