实验内容:
1
.二叉树的建立与遍历(验证性实验)
问题描述
建立一棵二叉树,并对其进行遍历(先序、中序和后序),打印输出遍历结果。
基本要求
从键盘接受输入(先序),以二叉链表作为存储结构,建立二叉树(以先序来建立),并采用递归
算法对其进行遍历(先序、中序和后序),将遍历结果打印输出。
测试数据
ABC
□□
DE
□
G
□□
F
□□□
(其中
□
表示空格字符),则输出结果为:先序为
ABCDEGF
,中序为
CBEGDFA
,
z
后序为
CGBFDBA
。
实验分析:
实验要求采用的是先序建立二叉树,在此可以使用一个递归的方式去建立,但是由于指针传递的问题,在此使用二级指针,原因的话可以见我写的另一篇文章:
(极易错)链表指针函数传递问题,含线性表入门实验–约瑟夫环问题c语言代码
三个遍历函数也使用递归,比较简单就不多说了,如果是0基础的话可以简单了解一下三种遍历的大致描述:
先序:规则是若
二叉树
若为空,则空操作返回,否则先访问根结点,然后遍历左子树,然后再遍历右子树
中序:若树为空,则空操作返回,否则从根结点开始,中序遍历根结点的左子树,然后就是访问根结点,最后中序遍历右子树
后序:若树为空,则空操作返回,否则从左到右先叶子后结点的方式遍历访问左右子树,最后是访问根结点
代码:
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
typedef struct BiTree
{
char data;
struct BiTree *lchild;
struct BiTree *rchild;
}BiTree,*BiTreePtr;
bool CreatBiTree(BiTreePtr *T)
{
char ch;
scanf("%c",&ch);
if(ch==' ') (*T)=NULL;
else
{
if(!((*T)=(BiTreePtr)malloc(sizeof(BiTree)))) exit(1);
(*T)->data=ch;
CreatBiTree(&((*T)->lchild));
CreatBiTree(&((*T)->rchild));
}
return true;
}
bool PreOrderTraverse(BiTreePtr T)
{
if(T)
{
printf("%c ",T->data);
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
else
return true;
return true;
}
bool InOrderTraverse(BiTreePtr T)
{
if(T)
{
InOrderTraverse(T->lchild);
printf("%c ",T->data);
InOrderTraverse(T->rchild);
}
else
return true;
return true;
}
bool PostOrderTraverse(BiTreePtr T)
{
if(T)
{
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
printf("%c ",T->data);
}
else
return true;
return true;
}
int main()
{
BiTreePtr T;
printf("输入先序创建二叉树序列:");
CreatBiTree(&T);
printf("先序遍历序列为:");
PreOrderTraverse(T);
printf("\n");
printf("中序遍历序列为:");
InOrderTraverse(T);
printf("\n");
printf("后序遍历序列为:");
PostOrderTraverse(T);
printf("\n");
return 0;
}
效果
版权声明:本文为m0_63222058原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。