二叉树

实验名称   二叉树      

  • 实验目的:

 1. 通过实验,掌握二叉树的建立与存储

2. 通过实验,掌握二叉树的遍历方法

二、实验环境:

Visual C++

三、实验内容:

(写出主要的内容)

1. 通过实验,掌握二叉树的建立与存储

2. 通过实验,掌握二叉树的遍历方法

四、实验步骤

建立二叉树,并通过调用函数,,输出先序遍历、中序遍历与后序遍历的结果。

五、实现操作

1. 二叉树的建立、存储与遍历

#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)

       {

              PostOrder(root->LChild);

              PostOrder(root->RChild);

              Visit(root->data);

       }

}



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);

}

本程序实现二叉树的操作:

可以进行建立二叉树, 递归先序、中序、后序遍历等操作。

按先序遍历的结果输入二叉树

请输入先序遍历二叉树的结果,程序据此建立二叉树。

对于叶子结点以空格表示。

例如:abc..de.g..f...(回车),建立如下二叉树:

           a

          /

         b

        / \

       c   d

          / \

         e   f

          \

           g

abc..de.g..f...

请选择:

1.递归先序遍历

2.递归中序遍历

3.递归后序遍历

4.按树状输出二叉树

5.重新构建二叉树

6.退出程序

1

先序遍历二叉树:abcdegf

请选择:

1.递归先序遍历

2.递归中序遍历

3.递归后序遍历

4.按树状输出二叉树

5.重新构建二叉树

6.退出程序

2

中序遍历二叉树:cbegdfa

请选择:

1.递归先序遍历

2.递归中序遍历

3.递归后序遍历

4.按树状输出二叉树

5.重新构建二叉树

6.退出程序

3

后序遍历二叉树:cgefdba

请选择:

1.递归先序遍历

2.递归中序遍历

3.递归后序遍历

4.按树状输出二叉树

5.重新构建二叉树

6.退出程序

4

a

   f

  d

    g

   e

 b

  c

请选择:

1.递归先序遍历

2.递归中序遍历

3.递归后序遍历

4.按树状输出二叉树

5.重新构建二叉树

6.退出程序

6

程序运行结束,按任意键退出!

六、心得体会:

1、在数结构中,结点间关系是前驱唯一而后继不唯一,即结点间是一对多的关系。

2、树结构是指具有分支关系的结构。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值