大学课程实验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 }
昔日我曾苍老,如今风华正茂(ง •̀_•́)ง