数据结构实验
(一) 实验题目:遍历二叉树。
请输入一棵二叉树的扩展的前序序列,经过处理后生成一棵二叉树,然后对于该二叉树输出前序、中序和后序遍历序列。
(二) 实验分析:
本次试验是要实现对二叉树的遍历。为此,我们必须根据输入的前序序列构造出一棵二叉树,然后对该二叉树进行前序、中序、后序遍历。构造该二叉树时,如果第一个字符为“*”,则该二叉树为空树,否则将该字符存入根结点,然后对二叉树的左右子树分别递归调用该函数。先序遍历二叉树时,先对根结点进行访问,然后对其左右子树分别递归调用该函数,直至访问结束。则该程序完毕。
(三) 实验步骤:
# define ok 1
# define error  0
# define overflow  -1
# include<stdio.h>
# include<stdlib.h>
typedef struct Bitnode
{char  data;
struct Bitnode  *lchild,*rchild;
}Bitnode,*Bitree;    /*定义树中结点的类型*/
int visit(char e)
{printf("%c",e);
return ok;     
}      /*定义visit函数*/
Bitree Creat_Tree(){
  char c;
  Bitree T;      /*定义二叉树的根结点*/
  c=getchar();      /*输入字符*/
  if(c=='*')T=NULL;      /*如果第一个字符是“*”,则该二叉树为空树*/
  else {T=(Bitree)malloc(sizeof(Bitnode));
              if(!T) exit(overflow);      /*如果不是,为该结点分配空间*/
              T->data=c;
T->lchild=Creat_Tree();    /*对左子树进行递归调用先序中序后序遍历二叉树Creat_Tree函数*/
T->rchild=Creat_Tree();    /*对右子树进行递归调用Creat_Tree函数*/
            }
return T;        /*返回该二叉树的根结点*/
}      /*按前序序列输入构造一棵二叉树函数*/   
int preordertraverse(Bitree T)
{if(T){
if(visit(T->data))    /*先访问根结点*/
  if(preordertraverse(T->lchild))    /*再递归访问该结点的左子树*/
    if(preordertraverse(T->rchild))  return ok;    /*再递归访问该结点的右子树*/
return error;
  }
else return ok;
}        /*前序访问二叉树函数*/
int inordertraverse(Bitree T)
{if(T){
      if(inordertraverse(T->lchild))      /*先递归访问该结点的左子树*/
        if(visit(T->data))    /*再访问根结点*/
          if(inordertraverse(T->rchild))  return ok;    /*再递归访问该结点的右子树*/
      return error;
      } 
else return ok;
}      /*中序访问二叉树函数*/
int lastordertraverse(Bitree T)
{if(T){
    if(lastordertraverse(T->lchild))    /*递归访问该结点的左子树*/
      if(lastordertraverse(T->rchild))      /*再递归访问该结点的右子树*/
        if(visit(T->data))    return ok;      /*递归访问该结点的左子树*/
return error;
  }
else return ok;
}      /*后序访问二叉树函数*/
main()
{Bitree T;      /*定义二叉树根结点*/
T=Creat_Tree();      /*调用构造二叉树函数*/
preordertraverse(T);  /*前序输出该二叉树*/
printf("\n");
inordertraverse(T);    /*中序输出该二叉树*/
printf("\n");
lastordertraverse(T);  /*后序输出该二叉树*/
printf("\n");
}      /*函数执行完毕*/
(四) 试验结果:                                                                                                         
         
     
(五) 试验总结:
本次试验着重考查我们对二叉树理论知识的学习及实际使用的情况。首先是如何构造一棵树,注意对二叉树结点的定义,然后是对二叉树的几种遍历方式,我们必须搞清楚几种遍历的区别,还应该注意到几种遍历的共性,熟悉这几种调用方式。
在本次试验中,我们应该认识到递归调用在函数中好处,在该程序中,递归在好几处中用到,使函数变得简洁易懂,这是我们在这次实验中应该掌握学习的。
这次试验我们应该对二叉树有一个更加深刻的认识,对以后的学习一定会产生深远的影响。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。