第五天-------二叉树的基本操作(实验报告)附源码

 一、 实验目的

     1.掌握二叉树的存储实现。

     2.掌握二叉树的遍历思想。

     3.掌握二叉树的常见算法的程序实现。

二、实验内容

1、实验内容

a)      从键盘上输入数据,建立二叉链表。

b)      前序遍历、中序遍历、后序遍历二叉树:递归算法。

c)      前序遍历、中序遍历、后序遍历二叉树:非递归算法。

d)      借助队列实现二叉树的层次遍历。

e)      在主函数中设计一个简单的菜单,分别调试上述算法。

f)       *综合训练:

家族关系查询系统:建立家族关系数据库,可以实现家族成员的添加,可以查询家族成员的双亲、祖先、兄弟、孩子和后代等信息。

2、主要数据类型与变量

1.类型定义 //二叉链表存储

        #define TElemType char  //元素类型

        typedef struct BiTNode{

            TElemType data;

            struct BiTNode *lchild, *rchild;

        } BiTNode, *BiTree;

3、算法思想描述

定义节点,首先将左右孩子的指针域置空,再有需要的时候讲左右孩子指向孩子节点。递归遍历注意输出语句的位置,层次遍历使用队列,能够很简单的输出所有的节点数据,非递归中注意指针指向的位置,自己不能够混乱。

三、系统测试

1、测试方案

本次实验自己没能够通过图形化界面将所有的步骤一一的展示出来,仅仅是将输入语句写出,然后自己建立好了二叉树,点击便直接将先序,中序,后序的递归和非递归遍历,以及层次遍历的所有结果输出,这样更加的直观,可以一下将全部的答案看到,然后去判断正误。

2、测试结果

1.本次采用的是直接输出结果的图形化界面,

输入的数据为abc  de g  f   ,以a开头,cd之间有两个空格,eg之间有两个空格,gf之间有一个空格,f之后又三个空格。

在这里面输入其他的字符串可能不会输出结果,原因可能是输入的字符串不能够形成一个二叉树,所以不能够直接输出结果。


附:程序源代码

BinTree.cpp

#include "BiTree.h"

#include "SqStack.h"

#include "LinkQueue.h"

Status CreateBiTree( BiTree &T ) {

      char ch;

      scanf ("%c", &ch );

      if ( ch ==' ') T = NULL;

      else{

            if ( !( T = ( BiTNode * ) malloc (sizeof(BiTNode ) ) ) )

                    exit( OVERFLOW );

            T->data = ch;

            CreateBiTree( T->lchild );

            CreateBiTree( T->rchild );

      }

      return OK;

 }

/*先序遍历二叉树*/

void PreOrderTraverse(BiTree T){

   if ( T ){

       printf("%c ", T->data);

       PreOrderTraverse( T->lchild);

       PreOrderTraverse( T->rchild);

    }

}

/*中序遍历二叉树*/

void InOrderTraverse(BiTree T){

   if ( T ){

           InOrderTraverse(T->lchild);

       printf("%c ", T->data);

       InOrderTraverse ( T->rchild);

    }

}

/*后序遍历二叉树*/

void PostOrderTraverse(BiTree T){

   if ( T ) {

           PostOrderTraverse ( T->lchild);

           PostOrderTraverse ( T->rchild);

           printf("%c ", T->data);

    }

}

/*按层次遍历二叉树*/

void LevelOrderTraversal( BiTree  T)

{

   LinkQueue Q; BiTree p;

   if ( !T ) return;    /* 若是空树则直接返回 */

   InitQueue( Q );     /*创建并初始化队列Q*/

   EnQueue( Q, T );

   while ( !QueueEmpty( Q ) ) {

       DeQueue( Q, p );

       printf("%c ", p->data); /*访问取出队列的结点*/

       if ( p->lchild ) EnQueue( Q, p->lchild );  /*左孩子入队列*/

       if ( p->rchild ) EnQueue( Q, p->rchild ); /*右孩子入队列*/

    }

}

/*先序非递归遍历二叉树*/

void PreTraverse(BiTree T)

{

   SqStack s;

   BiTree p;

    p= T;

   InitStack(s);

   if(!T) return;

    Push(s,T);

   while(!StackEmpty(s)){

       Pop(s,p);

       printf("%c ",p->data);

       if(p->rchild) Push(s,p->rchild);

       if(p->lchild) Push(s,p->lchild);

    }

   printf("\n");

}

/*中序非递归遍历二叉树*/

void InTraverse(BiTree T){

   SqStack s;

   BiTree p = T;

   InitStack(s);

   if(!T) return;

   while(p || !StackEmpty(s)){

       if(p){

           Push(s,p);

           p = p->lchild;

       }else{

           Pop(s,p);

           printf("%c ",p->data);

           p = p->rchild;

        }

    }

   printf("\n");

}

/*后序非递归遍历二叉树*/

void PostTraverse(BiTree T)

{

   SqStack s;

   BiTree pre=NULL,p;

   if(!T) return ;

   InitStack(s);

   Push(s,T);

   while(!StackEmpty(s)){

       GetTop(s,p);

       if((p->lchild == NULL && p->rchild == NULL)||

                (pre != NULL &&(p->lchild == pre || p->rchild == pre))){

           Pop(s,p);

           printf("%c ",p->data);

           pre = p;

       }else{

           if(p->rchild) Push(s,p->rchild);

           if(p->lchild) Push(s,p->lchild);

       }

    }

   printf("\n");

}

main.cpp

#include "BiTree.h"

int main()

{

   BiTree BT;

   printf("构建二叉树:\n");

   printf("请输入一串字符:\n");

   CreateBiTree(BT);

   printf("先序递归遍历序列:\n");

   PreOrderTraverse(BT);

   printf("\n");

   printf("中序递归遍历序列:\n");

   InOrderTraverse(BT);

   printf("\n");

   printf("后序递归遍历序列:\n");

   PostOrderTraverse(BT);

   printf("\n");

   printf("按层次遍历序列:\n");

   LevelOrderTraversal(BT);

   printf("\n");

   printf("先序非递归遍历序列:\n");

   PreTraverse(BT);

   printf("中序非递归遍历序列:\n");

   InTraverse(BT);

   printf("后序非递归遍历序列:\n");

   PostTraverse(BT);

   return 0;

}

 

猜你喜欢

转载自blog.csdn.net/iiiiiilikangshuai/article/details/80918696