数据结构实验报告,二叉树的基本操作(C语言)

简介: 数据结构实验报告,二叉树的基本操作(C语言)

数据结构实验报告,二叉树的基本操作(C语言)


作者:命运之光
专栏:数据结构


在这里插入图片描述


实验六 二叉树的基本操作
实验环境:Visual C++或Dev C++
实验目的:
1、掌握二叉树创建;
2、掌握二叉树的遍历及常用算法。
实验内容:
通过完全前序序列创建一棵二叉树,完成如下功能:
1)输出二叉树的前序遍历序列;
2)输出二叉树的中序遍历序列;
3)输出二叉树的后序遍历序列;
4)统计二叉树的结点总数;
5)统计二叉树中叶子结点的个数;


实验六 二叉树的基本操作


一、需求分析

通过完全前序序列创建一棵二叉树,完成如下功能:
1)创建二叉树;
2)输出二叉树的前序遍历序列;
3)输出二叉树的中序遍历序列;
4)输出二叉树的后序遍历序列;
5)统计二叉树的结点总数;
6)统计二叉树中叶子结点的个数;


二、概要设计

1.用结构体定义一个二叉树

//定义二叉树(二叉链式)
typedef struct BTnode {
    char data;
    struct BTnode* lchild;
    struct BTnode* rchild;
}BTnode, * BiTree;
其中用字符型来定义数据data
用lchild来定义左子树
用rchild来定义右子树

2.主程序

switch (x) {
        case 1:
            printf("输入二叉树结点的值:\n");
            T = creatT();
            break;
        case 2:
            //先序遍历
            printf("先序遍历二叉树:n");
            TraverseBiTree(T);
            break;
        case 3:
            //中序遍历
            printf("中序遍历二叉树:n");
            InOrderBiTree(T);
            break;
        case 4:
            //后序遍历
            printf("后序遍历二叉树:n");
            PostOrderBiTree(T);
            break;
        case 5:
            printf("二叉树的结点总数为:%d\n", count(T));
            break;
        case 6:
            //叶子结点数
            Leafcount(T, &num);
            printf("n树的叶子结点个数为:%d", num);
            break;
        default:exit(0);
        }
用switch函数来调用自定义中的所有函数来实现函数的调用。


三、详细设计

1)定义二叉树

//定义二叉树(二叉链式)
typedef struct BTnode{
   char data;
   struct BTnode *lchild;
   struct BTnode *rchild;
}BTnode,*BiTree;
BiTree T;

2)创建二叉树

//创建二叉树
BiTree creatT(){
 BTnode *T; 
 char ch;
 scanf("%c",&ch);
 if(ch=='#')  T=NULL;
 else{
     T=(BTnode*)malloc(sizeof(BTnode));
     T->data=ch;
     T->lchild=creatT();
     T->rchild=creatT(); 
 }
 return T;
}

3)先序遍历

void TraverseBiTree(BiTree T) {//先序遍历
//    BTnode *T; 
    if (T == NULL)
        return;
    else {
        printf("%c", T->data);
        TraverseBiTree(T->lchild);
        TraverseBiTree(T->rchild);
    }
}

4)中序遍历

//中序遍历 
void InOrderBiTree(BiTree T) {
    if (NULL == T)
        return;
    else {
        InOrderBiTree(T->lchild);
        printf("%c", T->data);
        InOrderBiTree(T->rchild);
    }
}

5)后续遍历

//后序遍历 
void PostOrderBiTree(BiTree T) {
    if (NULL == T)
        return;
    else {
        //中序遍历
        InOrderBiTree(T->lchild);
        InOrderBiTree(T->rchild);
        printf("%c", T->data);
    }
}

6)统计二叉树结点的个数

int count(BiTree T){
 int num,left,right;
 if(T==NULL) num=0;
 else{
   left=count(T->lchild);
   right=count(T->rchild);
   num=left+right+1;
 }
 return num; 
}

7)统计二叉树叶子结点个数

Leafcount(BiTree T, int num) {
    if (T)
    {
        if (T->lchild == NULL && T->rchild == NULL)
        {
            num++;
            printf("%c", T->data);
        }
        Leafcount(T->lchild, num);
        Leafcount(T->rchild, num);
    }
    //return num;
}

8)菜单

void menu(){
    BiTree T; 
 printf("*****************************************\n");
 printf("1:创建二叉树;\n");
 printf("2:先序遍历二叉树;\n");
 printf("3:中序遍历二叉树;\n");
 printf("4:后序遍历二叉树;\n");
 printf("5:统计二叉树结点个数;\n");
 printf("6:统计二叉树叶子结点个数;\n");
 printf("0:退出!\n");
 printf("*****************************************\n");
}

9)主函数

int main(){
 int x;
 BiTree T; 
 menu();
 scanf("%d",&x);
 getchar();
 while(x){   
   switch(x){
   case 1:
       printf("输入二叉树结点的值:\n");
       T=creatT();
       break;
   case 2:
       //先序遍历
           printf("先序遍历二叉树:n");
        TraverseBiTree(T);
        break;
   case 3:
        //中序遍历
        printf("中序遍历二叉树:n");
        InOrderBiTree(T);
        break;
   case 4:
        //后序遍历
           printf("后序遍历二叉树:n");
        PostOrderBiTree(T);
        break;
   case 5:
        printf("二叉树的结点总数为:%d\n",count(T));
        break;
   case 6:
        //叶子结点数
        count(T);
        Leafcount(T,num);
        printf("n树的叶子结点个数为:%d", num);
        break;
   default:exit(0);
   }
 getchar();
 printf("\n请选择要进行的操作:\n");
 menu();
 scanf("%d",&x);
 }
   printf("________________________________________");
   printf("\n\n");
}


四、调试分析

简单分析:
相比起之前的实验,要实现二叉树先需要定义出一个结构体,通过对左右子树的查找来实现先序中序以及后续遍历的结果,经行了简单的函数封装调用以及传参,通过switch来实现按钮操作,中途注意逻辑合理不要产生逻辑错误否则可能会导致输出结果的错误。
经验和体会:
通过对二叉树的建立我更加的理解了二叉树再程序中的一个执行步骤,先序中序后序遍历之间的不同,对与函数的调用以及传参的运用有了更加深刻的理解。体会到二叉树算法在实际的查找中的便利。


五、测试结果

调试测试数据:1、输入二叉树的结点建立二叉树;2、先序便利二叉树;3、中序遍历二叉树;4、后序遍历二叉树;5、统计二叉树结点个数;6、统计二叉树叶子结点个数;
数据测试如下截图:
输入:ab##c##
(1)输入二叉树的结点建立二叉树;
在这里插入图片描述
(2)先序便利二叉树;
在这里插入图片描述
(3)中序遍历二叉树;
在这里插入图片描述
(4)后序遍历二叉树;
在这里插入图片描述
(5)统计二叉树结点个数;
在这里插入图片描述
(6)统计二叉树叶子结点个数;
在这里插入图片描述


附录:源程序代码(带注释)

#include "stdio.h"
#include "string.h"
#include "stdlib.h"
int num=0;
//定义二叉树(二叉链式)
typedef struct BTnode{
   char data;
   struct BTnode *lchild;
   struct BTnode *rchild;
}BTnode,*BiTree;
BiTree T;
//创建二叉树
BiTree creatT(){
 BTnode *T; 
 char ch;
 scanf("%c",&ch);
 if(ch=='#')  T=NULL;
 else{
     T=(BTnode*)malloc(sizeof(BTnode));
     T->data=ch;
     T->lchild=creatT();
     T->rchild=creatT(); 
 }
 return T;
}
void TraverseBiTree(BiTree T) {//先序遍历
//    BTnode *T; 
    if (T == NULL)
        return;
    else {
        printf("%c", T->data);
        TraverseBiTree(T->lchild);
        TraverseBiTree(T->rchild);
    }
}
//中序遍历 
void InOrderBiTree(BiTree T) {
    if (NULL == T)
        return;
    else {
        InOrderBiTree(T->lchild);
        printf("%c", T->data);
        InOrderBiTree(T->rchild);
    }
}
//后序遍历 
void PostOrderBiTree(BiTree T) {
    if (NULL == T)
        return;
    else {
        //中序遍历
        InOrderBiTree(T->lchild);
        InOrderBiTree(T->rchild);
        printf("%c", T->data);
    }
}
//统计二叉树结点的个数
int count(BiTree T){
 int num,left,right;
 if(T==NULL) num=0;
 else{
   left=count(T->lchild);
   right=count(T->rchild);
   num=left+right+1;
 }
 return num; 
}
//结点数 
Leafcount(BiTree T, int num) {
    if (T)
    {
        if (T->lchild == NULL && T->rchild == NULL)
        {
            num++;
            printf("%c", T->data);
        }
        Leafcount(T->lchild, num);
        Leafcount(T->rchild, num);
    }
    //return num;
}
//菜单
void menu(){
    BiTree T; 
 printf("*****************************************\n");
 printf("1:创建二叉树;\n");
 printf("2:先序遍历二叉树;\n");
 printf("3:中序遍历二叉树;\n");
 printf("4:后序遍历二叉树;\n");
 printf("5:统计二叉树结点个数;\n");
 printf("6:统计二叉树叶子结点个数;\n");
 printf("0:退出!\n");
 printf("*****************************************\n");
}
//主函数
int main(){
 int x;
 BiTree T; 
 menu();
 scanf("%d",&x);
 getchar();
 while(x){   
   switch(x){
   case 1:
       printf("输入二叉树结点的值:\n");
       T=creatT();
       break;
   case 2:
       //先序遍历
           printf("先序遍历二叉树:n");
        TraverseBiTree(T);
        break;
   case 3:
        //中序遍历
        printf("中序遍历二叉树:n");
        InOrderBiTree(T);
        break;
   case 4:
        //后序遍历
           printf("后序遍历二叉树:n");
        PostOrderBiTree(T);
        break;
   case 5:
        printf("二叉树的结点总数为:%d\n",count(T));
        break;
   case 6:
        //叶子结点数
        count(T);
        Leafcount(T,num);
        printf("n树的叶子结点个数为:%d", num);
        break;
   default:exit(0);
   }
 getchar();
 printf("\n请选择要进行的操作:\n");
 menu();
 scanf("%d",&x);
 }
   printf("________________________________________");
   printf("\n\n");
}
适用于:
大一数据结构实验课实验报告——二叉树的练习(C语言版)

在这里插入图片描述

相关文章
|
2月前
|
算法 数据处理 C语言
C语言中的位运算技巧,涵盖基本概念、应用场景、实用技巧及示例代码,并讨论了位运算的性能优势及其与其他数据结构和算法的结合
本文深入解析了C语言中的位运算技巧,涵盖基本概念、应用场景、实用技巧及示例代码,并讨论了位运算的性能优势及其与其他数据结构和算法的结合,旨在帮助读者掌握这一高效的数据处理方法。
68 1
|
2月前
|
存储 算法 搜索推荐
【趣学C语言和数据结构100例】91-95
本文涵盖多个经典算法问题的C语言实现,包括堆排序、归并排序、从长整型变量中提取偶数位数、工人信息排序及无向图是否为树的判断。通过这些问题,读者可以深入了解排序算法、数据处理方法和图论基础知识,提升编程能力和算法理解。
69 4
|
2月前
|
存储 机器学习/深度学习 搜索推荐
【趣学C语言和数据结构100例】86-90
本文介绍并用C语言实现了五种经典排序算法:直接插入排序、折半插入排序、冒泡排序、快速排序和简单选择排序。每种算法都有其特点和适用场景,如直接插入排序适合小规模或基本有序的数据,快速排序则适用于大规模数据集,具有较高的效率。通过学习这些算法,读者可以加深对数据结构和算法设计的理解,提升解决实际问题的能力。
55 4
|
2月前
|
存储 算法 数据处理
【趣学C语言和数据结构100例】81-85
本文介绍了五个经典算法问题及其C语言实现,涵盖图论与树结构的基础知识。包括使用BFS求解单源最短路径、统计有向图中入度或出度为0的点数、统计无向无权图各顶点的度、折半查找及二叉排序树的查找。这些算法不仅理论意义重大,且在实际应用中极为广泛,有助于提升编程能力和数据结构理解。
57 4
|
11天前
|
Java C++
【C++数据结构——树】二叉树的基本运算(头歌实践教学平台习题)【合集】
本关任务:编写一个程序实现二叉树的基本运算。​ 相关知识 创建二叉树 销毁二叉树 查找结点 求二叉树的高度 输出二叉树 //二叉树节点结构体定义 structTreeNode{ intval; TreeNode*left; TreeNode*right; TreeNode(intx):val(x),left(NULL),right(NULL){} }; 创建二叉树 //创建二叉树函数(简单示例,手动构建) TreeNode*create
36 12
|
11天前
|
C++
【C++数据结构——树】二叉树的性质(头歌实践教学平台习题)【合集】
本文档介绍了如何根据二叉树的括号表示串创建二叉树,并计算其结点个数、叶子结点个数、某结点的层次和二叉树的宽度。主要内容包括: 1. **定义二叉树节点结构体**:定义了包含节点值、左子节点指针和右子节点指针的结构体。 2. **实现构建二叉树的函数**:通过解析括号表示串,递归地构建二叉树的各个节点及其子树。 3. **使用示例**:展示了如何调用 `buildTree` 函数构建二叉树并进行简单验证。 4. **计算二叉树属性**: - 计算二叉树节点个数。 - 计算二叉树叶子节点个数。 - 计算某节点的层次。 - 计算二叉树的宽度。 最后,提供了测试说明及通关代
36 10
|
11天前
|
存储 算法 测试技术
【C++数据结构——树】二叉树的遍历算法(头歌教学实验平台习题) 【合集】
本任务旨在实现二叉树的遍历,包括先序、中序、后序和层次遍历。首先介绍了二叉树的基本概念与结构定义,并通过C++代码示例展示了如何定义二叉树节点及构建二叉树。接着详细讲解了四种遍历方法的递归实现逻辑,以及层次遍历中队列的应用。最后提供了测试用例和预期输出,确保代码正确性。通过这些内容,帮助读者理解并掌握二叉树遍历的核心思想与实现技巧。
34 2
|
25天前
|
数据库
数据结构中二叉树,哈希表,顺序表,链表的比较补充
二叉搜索树,哈希表,顺序表,链表的特点的比较
数据结构中二叉树,哈希表,顺序表,链表的比较补充
|
2月前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
87 5
|
2月前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
80 1