二叉树的二叉链表存储表示与先序便利算法递归实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
二叉树的二叉链表存储表示与先序便利算法递归实现
目录
1:二叉树的定义和性质
1.1:二叉树的定义
1.2:二叉树的性质
2:二叉树的二叉链表存储表示
2.1:二叉树的二叉链表存储表示
2.2:二叉树的二叉链表的实例3:先序遍历二叉树
3.1:先序遍历二叉树的语言描述
3.2:先序遍历二叉树的实例
1.二叉树的定义和性质
1.1:二叉树的定义
二叉树(BinaryTree)是n(n≥0)个结点的有限集,它或者是空集(n=0),或者由一个根结点及两棵互不相交的(分别称作这个根的左子树和右子树)的二叉树组成。
1.2 :二叉树的性质
性质1 在二叉树的第i层上至多有2i-1个结点(i>=1)。
证明采用归纳法证明此性质。
当i=1时,只有一个根结点,2i-1=20 =1,命题成立。
现在假定对所有的j,1<=j
那么可以证明j=i时命题也成立。由归纳假设可知,第i -1层上至多有2i-2个结点。
由于二叉树每个结点的度最大为2,故在第i层上最大结点数为第i-1
层上最大结点数的二倍,即2×(2i-2)=2i-1。
性质2深度为k的二叉树至多有2k-1个结点(k>=1)。
证明第i层的结点数为xi(1≤i≤k),深度为k的二叉树的结点数为M,xi最多为2i-1,则有:
性质3 对于一棵非空的二叉树,如果叶子结点数为n0,度数为2的结点数为n2,则有n0=n2+1。
证明设二叉树中度为1的结点数为n1,二叉树中总结点
数为N,因为二叉树中所有结点均小于或等于2,所以有:N=n0+n1+n2 (5-1)
再看二叉树中的分支数,除根结点外,其余结点都有一个进入分支,设B为二叉树中的分支总数,则有:
N=B+1。
由于这些分支都是由度为1和2的结点发出的,所以有: B=n1+2*n2
N=B+1=n1+2×n2+1 (5-2)
由式(5-1)和(5-2)得到:
n0+n1+n2 = n1+2×n2+1
n0=n2+1
性质4具有n个结点的完全二叉树的深度k为log2n+1 。证明设所求完全二叉树的深度为k,根据完全二叉树的定义和性质2可知,k-1层满二叉树的结点个数为n时,有
2k-1-1 即 2k-1≤n<2k 对不等式取对数,有 k-1≤log2n 由于k是整数,所以有k-1=log2n,k=log2n+1,结论成立。性质5如果对一棵有n个结点的完全二叉树的结点按层序编号(从第1层到第 +1层,每层从左到右),则对任一结点i (1<=i<=n),有: (1)如果i=1,则结点i无双亲,是二叉树的根;如果i>1,则其双亲是结点。 (2)如果2i>n,则结点i为叶子结点,无左孩子;否则,其左孩子是结点2i。 (3)如果2i+1>n,则结点i无右孩子;否则,其右孩子 有时为了便于找到结点的双亲,则可在结点结 构中增加一个只想其双亲结点的指针域,如下图: 而链表的头指针指向二叉树的根结点。 二叉树的二叉链表存的C语言表示如下: TypedefstructBiTNode{ TElemType data; StructBiTNode *lchild, *rchild;//左右孩子指针} (1)访问根节点; (2)先序遍历左子树; (3)先序遍历右子树。 3.2:先序遍历二叉树的实例 (1)在纸上画出一棵二叉树。 A B E C D G F (2) 输入各个结点的数据。 # define lensizeof(bitreptr) bitreptr *bt; intf,g; bitreptr /*二叉树结点类型说明*/ { char data; bitreptr *lchild,*rchild; }; preorder(bitreptr *bt) /*先序遍历二叉树*/ { if(g==1) printf("先序遍历序列为:\n"); g=g+1; if(bt) { printf("%6c",bt->data); preorder(bt->lchild); preorder(bt->rchild); } else if(g==2) printf("空树\n"); } bitreptr *crt_bt() /*建立二叉树*/ { bitreptr *bt; charch; if(f==1) printf("输入根结点,#表示结束\n"); else printf("输入结点,#表示结束\n"); scanf("\n%c",&ch); f=f+1; if(ch=='#') bt=null; else { bt=(bitreptr *)malloc(len); bt->data=ch; printf("%c 左孩子",bt->data); bt->lchild=crt_bt(); printf("%c 右孩子",bt->data); bt->rchild=crt_bt(); } return(bt); } main() { f=1; g=1; bt=crt_bt(); preorder(bt); }