数据结构(C语言) 实验---二叉树及其应用
[问题描述]
(1)创建一颗二叉树,用递归方法实现对其进行先序、中序和后序遍历的操作;
(2)递归实现二叉树左右子树的交换。
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define MAXSIZE 100
/**二叉树数据结构定义**/
typedef struct BiTreeNode
{
char data;
struct BiTreeNode *left;
struct BiTreeNode *right;
}BiTreeNode,*BiTree;
/**二叉树的建立--按照先序方式建立--插入**/
void CreateBiTree(BiTree *T)//eg.ABC##DE#G##F###
{
char val;
scanf("%c",&val);
if(val == '#')
*T = NULL; //null表示为空枝
else
{
*T = (BiTree)malloc(sizeof(BiTreeNode));
(*T)->data = val;
CreateBiTree(&(*T)->left);
CreateBiTree(&(*T)->right);
}
}
/**先序遍历 根左右**/
void PreOrderTravel(BiTree T)
{
if(T==NULL)
return;
printf("%c ",T->data);
PreOrderTravel(T->left);
PreOrderTravel(T->right);
}
/**中序遍历 左根右**/
void InOrderTravel(BiTree T)
{
if(T==NULL)
return;
InOrderTravel(T->left);
printf("%c ",T->data);
InOrderTravel(T->right);
}
/**后序遍历 左右根**/
void TailOrderTravel(BiTree T)
{
if(T==NULL)
return;
TailOrderTravel(T->left);
TailOrderTravel(T->right);
printf("%c ",T->data);
}
/*递归实现二叉树左右子树的交换 */
void swap(BiTree &T)
{
BiTree tempT;
if(T)
{
swap(T->left);//递归交换结点左孩子的左右子树。。。
swap(T->right);//递归交换结点右孩子的左右子树。。
tempT = T->left;//交换左右子树
T->left = T->right;
T->right = tempT;
}
}
int main()
{
printf("测试代码\n");
BiTree T;
T = (BiTree)malloc(sizeof(BiTreeNode));
printf("请给二叉树按照先序方式依次输入结点的值(空结点为#):\n");
CreateBiTree(&T);
printf("创建成功\n");
do
{
printf("1.先序方式遍历,2.中序方式遍历,3.后序方式遍历,4.交换左右子树,0.退出\n");
printf("请选择要进行的操作:");
int select;
scanf("%d",&select);
if(select==0) break;
switch(select)
{
case 0:
break;
case 1:
printf("先序方式遍历结果:\n");
PreOrderTravel(T);
printf("\n");
break;
case 2:
printf("中序方式遍历结果:\n");
InOrderTravel(T);
printf("\n");
break;
case 3:
printf("后序方式遍历结果:\n");
TailOrderTravel(T);
printf("\n");
break;
case 4:
swap(T);
printf("交换后先序方式遍历结果:\n");
PreOrderTravel(T);
printf("\n");
break;
default:
printf("你进行了错误操作,请重新选择\n");
break;
}
}while(1);
return 0;
}
实验结果