二叉树的二叉链表存储表示与先序便利算法递归实现

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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);

}

相关文档
最新文档