数据结构--二叉树的建立、遍历

课程实验。多有不足


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

#define TRUE       1
#define FALSE      0
#define OK         1
#define ERROR      0

//DataType 是二叉树数据元素类型,此程序定义为char型
typedef char DataType;

typedef struct Node
{
DataType data;
struct Node *LChild;
struct Node *RChild;
}BiTNode, *BiTree;

void CreateBiTree(BiTree *bt)
{
char ch;
ch=getchar();
if(ch==’.’)
  *bt=NULL;
else
{
  *bt=(BiTree)malloc(sizeof(BiTNode));
  (*bt)->data=ch;
  CreateBiTree(&((*bt)->LChild));
        CreateBiTree(&((*bt)->RChild));
}
}

int Create(BiTree *T)
{//生成一个二叉树
  printf("按先序遍历的结果输入二叉树\n");
  printf("请输入先序遍历二叉树的结果,程序据此建立二叉树。\n");
  printf("对于叶子结点以空格表示。\n");
  printf("例如:abc..de.g..f...(回车),建立如下二叉树:\n");
  printf("           a      \n");
  printf("          /       \n");
  printf("         b        \n");
  printf("        / \\       \n");
  printf("       c   d      \n");
  printf("          / \\     \n");
  printf("         e   f    \n");
  printf("          \\       \n");
  printf("           g      \n");
  CreateBiTree(T);
  return OK;
}

int DestroyBiTree(BiTree *T){
  if(*T){
    if((*T)->LChild) DestroyBiTree(&((*T)->LChild));   //销毁左子树
    if((*T)->RChild) DestroyBiTree(&((*T)->RChild));   //销毁右子树
    free(*T);   //销毁根结点
    *T=NULL;
  }
  return OK;
}

int Visit(char c)
{
  printf("%c",c);  //显示结点数据域
  return OK;
}

void  PreOrder(BiTree root)
/*先序遍历二叉树, root为指向二叉树(或某一子树)根结点的指针*/
{
if(root!=NULL)
{
  Visit(root->data);
  PreOrder(root->LChild);
  PreOrder(root->RChild);
}
}

void  InOrder(BiTree root) 
/*中序遍历二叉树, root为指向二叉树(或某一子树)根结点的指针*/
{
if(root!=NULL)
{
  InOrder(root->LChild);
  Visit(root->data);
  InOrder(root->RChild);
}
}

void  PostOrder(BiTree root) 
/* 后序遍历二叉树,root为指向二叉树(或某一子树)根结点的指针*/
{
if(root!=NULL)
{
  PreOrder(root->LChild);
  Visit(root->data);
  PreOrder(root->RChild);
}
}

void PrintTree(BiTree bt,int nLayer)  /* 按竖向树状打印的二叉树 */
{
if(bt==NULL) return;
PrintTree(bt->RChild,nLayer+1);
for(int i=0;i<nLayer;i++)
  printf(" ");
printf("%c\n",bt->data);
    PrintTree(bt->LChild,nLayer+1);
}

void main(){
  BiTree T;
  int choice,flag=1;
  printf("本程序实现二叉树的操作:\n");
  printf("可以进行建立二叉树, 递归先序、中序、后序遍历等操作。\n");
  Create(&T);
  while(flag)
  {
    printf("请选择: \n");
    printf("1.递归先序遍历\n");
    printf("2.递归中序遍历\n");
    printf("3.递归后序遍历\n");
    printf("4.按树状输出二叉树\n");
    printf("5.重新构建二叉树\n");
    printf("6.退出程序\n");
    scanf("%d",&choice);
    switch(choice){
      case 1:
if(T){
   printf("先序遍历二叉树:");
   PreOrder(T); //先序递归遍历二叉树
   printf("\n");
}
else
   printf("二叉树为空!\n");
break;
      case 2:
if(T){
   printf("中序遍历二叉树:");
   InOrder(T);  //中序递归遍历二叉树
   printf("\n");
}
else
   printf("二叉树为空!\n");
break;
      case 3:
if(T){
   printf("后序遍历二叉树:");
   PostOrder(T);//后序递归遍历二叉树
   printf("\n");
}
else
   printf("二叉树为空!\n");
break;
      case 4:
PrintTree(T,0);
break;
       case 5:
DestroyBiTree(&T);
fflush(stdin);
CreateBiTree(&T);
break;
      default:
flag=0;
printf("程序运行结束,按任意键退出!\n");
getchar();
    }
  }
  DestroyBiTree(&T);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值