数据结构二叉树操作实验报告

时间:2024.4.27

 实验报告

指导教师     XX                                   实验时间:2010111

学院     计算机学院       专业   信息安全               

班级   XXXXXX       学号   XXXXX        姓名  XX      实验室  S331     

实验题目:二叉树操作

实验要求:

    采用二叉树链表作为存储结构,完成二叉树的建立,先序、中序和后序以及按层次遍历的操作,求所有叶子及结点总数的操作。

示例程序:

#include"stdio.h"

#include"string.h"

#define Max 20         //结点的最大个数

typedef struct node{

    char data;

    struct node *lchild,*rchild;

}BinTNode;            //自定义二叉树的结点类型

typedef BinTNode *BinTree;    //定义二叉树的指针

int NodeNum,leaf;            //NodeNum为结点数,leaf为叶子数

//==========基于先序遍历算法创建二叉树==============

//=====要求输入先序序列,其中加入虚结点“#”以示空指针的位置==========

BinTree CreatBinTree(void)

{

    BinTree T;

    char ch;

    if((ch=getchar())=='#')

    return(NULL);       //读入#,返回空指针

    else{             

    T=(BinTNode *)malloc(sizeof(BinTNode));   生成结点

        T->data=ch;

    T->lchild=CreatBinTree();        //构造左子树

        T->rchild=CreatBinTree();        //构造右子树

    return(T);

    }

}

//========NLR 先序遍历=============

void Preorder(BinTree T)

{

    if(T) {

        printf("%c",T->data);    //访问结点

        Preorder(T->lchild);    //先序遍历左子树

        Preorder(T->rchild);    //先序遍历右子树

    }

}

//========LNR 中序遍历===============

//==========LRN 后序遍历============

//=====采用后序遍历求二叉树的深度、结点数及叶子数的递归算法========

int TreeDepth(BinTree T)

{

    int hl,hr,max;

    if(T){

    hl=TreeDepth(T->lchild);   //求左深度

        hr=TreeDepth(T->rchild);    //求右深度

    max=hl>hr? hl:hr;           //取左右深度的最大值

        NodeNum=NodeNum+1;         //求结点数

    if(hl==0&&hr==0) leaf=leaf+1;  //若左右深度为0,即为叶子。

        return(max+1);

    }

    else return(0);

}

//====利用“先进先出”(FIFO)队列,按层次遍历二叉树==========

void Levelorder(BinTree T)

{

    int front=0,rear=1;

    BinTNode *cq[Max],*p;   //定义结点的指针数组cq

    cq[1]=T;                //根入队

    while(front!=rear)     

    {

        front=(front+1)%NodeNum;

        p=cq[front];            //出队

        printf("%c",p->data);     //出队,输出结点的值

        if(p->lchild!=NULL){

        rear=(rear+1)%NodeNum;

            cq[rear]=p->lchild;     //左子树入队

        }

        if(p->rchild!=NULL){

        rear=(rear+1)%NodeNum;

            cq[rear]=p->rchild;     //右子树入队

    }

    }

}

//==========主函数=================

void main()

{

    BinTree root;

    int i,depth;

    printf("\n");

printf("Creat Bin_Tree; Input preorder:"); //输入完全二叉树的先序序列,

                         // 用#代表虚结点,如ABD###CE##F##

    root=CreatBinTree();       //创建二叉树,返回根结点

    do {                    //从菜单中选择遍历方式,输入序号。

        printf("\t********** select ************\n");

    printf("\t1: Preorder Traversal\n");   

        printf("\t2: Iorder Traversal\n");

    printf("\t3: Postorder traversal\n");

        printf("\t4: PostTreeDepth,Node number,Leaf number\n");

    printf("\t5: Level Depth\n"); //按层次遍历之前,先选择4,求出该树的结点数。

    printf("\t0: Exit\n");

        printf("\t*******************************\n");

    scanf("%d",&i);    //输入菜单序号(0-5)

    switch (i){

            case 1: printf("Print Bin_tree Preorder: ");

        Preorder(root);      //先序遍历

                break;

    case 2: printf("Print Bin_Tree Inorder: ");

                Inorder(root);      //中序遍历

        break;

        case 3: printf("Print Bin_Tree Postorder: ");

                Postorder(root);    //后序遍历

        break;

    case 4: depth=TreeDepth(root);     //求树的深度及叶子数

            printf("BinTree Depth=%d  BinTree Node number=%d",depth,NodeNum);

                printf("  BinTree Leaf number=%d",leaf);

            break;

            case 5: printf("LevePrint Bin_Tree: ");

        Levelorder(root);     //按层次遍历

                break;

        default: exit(1);

    }

        printf("\n");

    } while(i!=0);

实验内容及步骤:

1、分析、理解程序。

2、添加中序和后序遍历算法.

3、调试程序,设计一棵二叉树,输入完全二叉树的先序序列,用#代表虚结点(空指针),如ABD###CE##F##,建立二叉树,求出先序、中序和后序以及按层次遍历序列,求所有叶子及结点总数。

4、画出所设计的二叉树,以后序遍历算法为例,画出执行踪迹示意图。给出实验结果。

5、给出实验结果。

改正后的完整程序:

#include"stdio.h"

#include"string.h"

#include<malloc.h>

#include<stdlib.h>

#define Max 20         //结点的最大个数

typedef struct node{

    char data;

    struct node *lchild,*rchild;

}BinTNode;            //自定义二叉树的结点类型

typedef BinTNode *BinTree;    //定义二叉树的指针

int NodeNum,leaf;            //NodeNum为结点数,leaf为叶子数

//==========基于先序遍历算法创建二叉树==============

//=====要求输入先序序列,其中加入虚结点"#"以示空指针的位置==========

BinTree CreatBinTree(void)

{

    BinTree T;

    char ch;

    if((ch=getchar())=='#')

       return(NULL);       //读入#,返回空指针

    else{             

       T=(BinTNode *)malloc(sizeof(BinTNode));  // 生成结点

              T->data=ch;

       T->lchild=CreatBinTree();        //构造左子树

              T->rchild=CreatBinTree();        //构造右子树

       return(T);

    }

}

//========NLR 先序遍历=============

void Preorder(BinTree T)

{

    if(T) {

              printf("%c",T->data);    //访问结点

              Preorder(T->lchild);    //先序遍历左子树

           Preorder(T->rchild);    //先序遍历右子树

    }

}

//========LNR 中序遍历===============

void Inorder(BinTree T)

{

    if(T) {

              Inorder(T->lchild);    //先序遍历左子树

        printf("%c",T->data);    //访问结点

           Inorder(T->rchild);    //先序遍历右子树

    }

}

/*void Inorder(BinTree T)    

while(p||!StackEmpty(BinTree T)){

              if(T) {Push (BinTree T,T);T=T->lchild;}//根指针进栈,遍历左子树

       else{    //根指针退栈,访问根节点,遍历右子树

              Pop(BinTree T,t);

              if(!Visit(T->data))

                     return ERROR;

              T=T-rchild;

       }//else

       }//while

       return OK;

}

*/

//==========LRN 后序遍历============

void Postorder(BinTree T)

{

    if(T) {

              Postorder(T->lchild);    //先序遍历左子树

           Postorder(T->rchild);      //先序遍历右子树

        printf("%c",T->data);    //访问结点

    }

}

//=====采用后序遍历求二叉树的深度、结点数及叶子数的递归算法========

int TreeDepth(BinTree T)

{

    int hl,hr,max;

    if(T){

       hl=TreeDepth(T->lchild);   //求左深度

              hr=TreeDepth(T->rchild);    //求右深度

       max=hl>hr? hl:hr;           //取左右深度的最大值

              NodeNum=NodeNum+1;         //求结点数

       if(hl==0&&hr==0) leaf=leaf+1;  //若左右深度为0,即为叶子。

              return(max+1);

    }

    else return(0);

}

//====利用"先进先出"(FIFO)队列,按层次遍历二叉树==========

void Levelorder(BinTree T)

{

    int front=0,rear=1;

    BinTNode *cq[Max],*p;   //定义结点的指针数组cq

    cq[1]=T;                //根入队

    while(front!=rear)     

    {

              front=(front+1)%NodeNum;

              p=cq[front];            //出队

              printf("%c",p->data);     //出队,输出结点的值

              if(p->lchild!=NULL){

           rear=(rear+1)%NodeNum;

                  cq[rear]=p->lchild;     //左子树入队

              }

              if(p->rchild!=NULL){

           rear=(rear+1)%NodeNum;

                  cq[rear]=p->rchild;     //右子树入队

       }

    }

}

//==========主函数=================

void main()

{

    BinTree root;

    int i,depth;

    printf("\n");

printf("Creat Bin_Tree; Input preorder:"); //输入完全二叉树的先序序列,

                         // 用#代表虚结点,如ABD###CE##F##

    root=CreatBinTree();       //创建二叉树,返回根结点

    do {                    //从菜单中选择遍历方式,输入序号。

              printf("\t********** select ************\n");

       printf("\t1: Preorder Traversal\n");   

              printf("\t2: Iorder Traversal\n");

       printf("\t3: Postorder traversal\n");

              printf("\t4: PostTreeDepth,Node number,Leaf number\n");

       printf("\t5: Level Depth\n"); //按层次遍历之前,先选择4,求出该树的结点数。

       printf("\t0: Exit\n");

              printf("\t*******************************\n");

       scanf("%d",&i);    //输入菜单序号(0-5)

       switch (i){

                     case 1: printf("Print Bin_tree Preorder: ");

              Preorder(root);      //先序遍历

                            break;

       case 2: printf("Print Bin_Tree Inorder: ");

                            Inorder(root);      //中序遍历

              break;

              case 3: printf("Print Bin_Tree Postorder: ");

                            Postorder(root);    //后序遍历

              break;

       case 4: depth=TreeDepth(root);     //求树的深度及叶子数

                     printf("BinTree Depth=%d  BinTree Node number=%d",depth,NodeNum);

                            printf("  BinTree Leaf number=%d",leaf);

                     break;

                     case 5: printf("LevePrint Bin_Tree: ");

              Levelorder(root);     //按层次遍历

                            break;

              default: exit(1);

       }

              printf("\n");

    } while(i!=0);

程序结果:

二叉树及后序遍历(虚线路径)

心得体会:

通过本次实验,我熟练了二叉树先序、中序和后序三种遍历,不仅是程序的编写,还有二叉树的绘制。

更多相关推荐:
数据结构C二叉树实验报告

北京林业大学12学年13学年第1学期数据结构实验报告书专业自动化班级111姓名宁友菊学号111044120实验地点B2机房任课教师孟伟实验题目二叉树的基本操作实验环境VisualC实验目的1掌握二叉树的定义2掌...

数据结构树和二叉树实验报告

数据结构课程实验报告注空间不够可以增加页码

数据结构二叉树实验报告(附代码)

一实验构思Conceive10本部分应包括描述实验实现的基本思路包括所用到的离散数学工程数学程序设计算法等相关知识首先构造二叉树的存储结构用data存储当前节点的值分别用lchildrchild表示该节点的左右...

数据结构二叉树综合实验报告

武汉工程大学计算机科学与工程学院《数据结构》实验报告[2]

数据结构之二叉树编程实验报告

实验报告二叉树题目建立一棵二叉树数据以字符串形式从键盘输入在此二叉树上完成1前序中序后序遍历2求出叶子数3求树高4左右子树交换输出交换后的前序中序遍历序列分析建树输入的字符串序列为带有空节点的前序遍历序列空节点...

数据结构-二叉树实验报告

数据结构实验报告课程数据结构实验名称二叉树实验院系电信学院专业班级计科104姓名学号一实验构思首先构造二叉树的存储结构用data存储当前节点的值分别用lchildrchild表示该节点的左右孩子然后应用BiTr...

华科数据结构二叉树实验报告

课程实验报告课程名称数据结构专业班级计算机科学与技术130班学号姓名指导教师报告日期20xx513计算机科学与技术学院目录实验三基于二叉链表的二叉树实现41问题描述142系统设计143系统实现144效率分析14...

《数据结构》综合性实验-平衡二叉排序树实验指导

数据结构综合性设计性实验指导一实验题目实现平衡二叉排序树的各种算法二实验内容用函数实现如下平衡二叉排序树算法1插入新结点2前序中序后序遍历二叉树递归3前序中序后序遍历的非递归算法4层次遍历二叉树5在二叉树中查找...

数据结构树的实验报告

数据结构实验报告目的要求1掌握二叉树的存储实现2掌握二叉树的遍历思想3掌握二叉树的常见算法的程序实现实验内容1输入字符序列建立二叉链表2中序遍历二叉树递归算法3中序遍历二叉树非递归算法最好也能实现先序后序非递归...

太原理工大学数据结构实验报告

数据结构实验报告课程名称数据结构实验项目线性表树图查找内排序实验地点专业班级物联网学号学生姓名指导教师周杰伦20xx年月日实验一线性表目的与要求本次实习的主要目的是为了使学生熟练掌握线性表的基本操作在顺序存储结...

数据结构实验三——二叉树基本操作及运算实验报告

39985504doc数据结构与数据库实验报告实验题目二叉树的基本操作及运算学院化学与材料科学学院专业班级09级材料科学与工程系PB0920xx3姓学邮名李维谷号PB0920xx85箱liwgmail指导教师贾...

数据结构实验报告(C语言)(强力推荐)

数据结构实验实验内容和目的掌握几种基本的数据结构集合线性结构树形结构等在求解实际问题中的应用以及培养书写规范文档的技巧学习基本的查找和排序技术让我们在实际上机中具有编制相当规模的程序的能力养成一种良好的程序设计...

数据结构二叉树实验报告(35篇)