大学课程实验2指导-二叉树的建立与遍历

实验目的:

  • 深入理解二叉树的递归建立以及遍历过程。
  • 了解二叉树遍历的非递归算法。

实验内容:

对于如下的二叉树:

要求编程实现:

1.以递归方式建立该二叉树。

2.以递归方式实现对该二叉树的先序、中序和后序遍历。

步骤1:包含必要的函数库

1 #include <stdio.h>
2 #include <stdlib.h>

 

步骤2:实现结构体BiTNode

1 typedef struct BiTNode{
2         char data;
3         struct BiTNode *lchild, *rchild;
4 }BiTNode, *BiTree;

 

步骤3:实现函数Create_BiTree()

void Create_BiTree(BiTree *T)

F提示1:参数T为指向"二叉树的头结点指针"的指针即

BiTree *T;

等价于

BiTNode **T;

F提示2:由于需要在函数中修改T所指向的指针的内容(即调用Create_BiTree ()之前,指向"二叉树的根结点"的指针为空,调用Create_BiTree ()之后,该指针指向新创建的根结点),因此需要在T前加"*"号。

F提示3:由于*T表示二叉树根结点的地址,因此在修改根结点的data域时,可以执行:

(*T)->data=ch;

等价于

(*(*T)).data=ch;

F提示4:由于函数的参数类型为"指向指针的指针",因此在创建左、右子数时,需要传入左、右的根结点的地址,即&(*T)->lchild或&(*T)->rchild。

F提示5:malloc()函数是在函数库stdlib.h中定义的,因此必须引入该库

 1 /*构造二叉树的二叉链表T */
 2 
 3 void Create_BiTree(BiTree *T){
 4 
 5     char ch;
 6 
 7     ch=getchar();
 8 
 9     //若输入'@',则建立空二叉树
10 
11     if(ch=='@') *T=NULL;
12 
13     else{
14 
15     *T=(BiTree)malloc(sizeof(BiTNode));
16 
17         /*生成根结点*/
18 
19 (*T)->data=ch;
20 
21 /*构造左子树*/
22 
23 Create_BiTree(&(*T)->lchild);
24 
25 /*构造右子树*/
26 
27         Create_BiTree(&(*T)->rchild);
28 
29      }
30 
31 }

 

 

步骤4:实现遍历函数PreOrder()、InOrder()、PostOrder()

提示5:这些函数均采用递归方式实现。另外,在访问某个结点时,无需采用课本中的函数指针visit,仅需要利用printf()函数打印该结点的data域即可。三个遍历函数的声明如下:

1 void PreOrder(BiTree T);
2 
3 void InOrder(BiTree T);
4 
5 void PostOrder(BiTree T);

 

步骤5:在主函数中实现对二叉树的建立以及前、中、后序遍历

 1 int main()
 2 
 3 {
 4 
 5 /*声明BiTree类型指针T,它的作用是将来指向新创建的二叉树的根*/
 6 
 7 BiTree T;
 8 
 9     printf("\n输入叶结点的信息(建立空二叉树输入@): ");
10 
11     /*可以输入以下的测试数据ABC@@DE@G@@F@@@ */
12 
13     
14 
15 /*建立二叉树T*/
16 
17 Create_BiTree(&T);
18 
19     printf("\n");
20 
21     printf("\n前序遍历结果: ");
22 
23     PreOrder(T);
24 
25     printf("\n中序遍历结果: ");
26 
27     InOrder(T);
28 
29     printf("\n后序遍历结果: ");
30 
31     PostOrder(T);
32 
33     printf("\n");
34 
35 }

 

程序提示输入测试数据

 

输入测试数据

最终输出效果

 

思考题

1.思考如何实现以非递归方式遍历二叉树?

 1 /*先序遍历二叉树*/
 2 
 3 void PreOrder(BiTree T){
 4 
 5     if(T){
 6 
 7         printf("%3c",T->data);
 8 
 9         PreOrder(T->lchild);
10 
11         PreOrder(T->rchild);
12 
13      }
14 
15 }
16 
17 /*中序遍历二叉树*/
18 
19 void InOrder(BiTree T){
20 
21     if(T){
22 
23         InOrder(T->lchild);
24 
25         printf("%3c",T->data);
26 
27         InOrder(T->rchild);
28 
29      }
30 
31 }
32 
33 /*后序遍历二叉树*/
34 
35 void PostOrder(BiTree T){
36
37     if(T){
38 
39         PostOrder(T->lchild);
40 
41         PostOrder(T->rchild);
42 
43         printf("%3c",T->data);
44 
45     }
46 
47 }

 

转载于:https://www.cnblogs.com/lgqrlchinese/p/10073648.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值