哈工大 数据结构与算法 作业3-树形结构及其应用

数据结构与算法 作业1——线性结构的存储结构与应用(SeqList) 哈工大数据结构与算法作业1中顺序存储部分,小白一枚,仅以此博客记录学习过程,恳请批评指正。 阅读详情

作业题目:二叉树存储结构的建立、遍历和应用

树型结构的遍历是树型结构算法的基础,本实验要求编写程序演示二叉树 的存储结构的建立方法、遍历过程以及应用。

作业要求:

1.编写建立二叉树的二叉链表存储结构(左右链表示)的程序,并以适当的形 式显示和保存二叉树;

2.采用二叉树的二叉链表存储结构,编写程序实现二叉树的先序、中序和后序 遍历的递归和非递归算法以及层序遍历算法,并以适当的形式显示和保存二叉树 及其相应的遍历序列;

3.设计并实现判断任意一棵二叉树是否为完全二叉树的算法。

4.设计并实现计算任意一棵二叉树的宽度的(递归或非递归)算法。二叉树的 宽度是指其各层结点数的最大值。 注:二叉树的显示(输出)以适当的形式即可。不必采用可视化的图形方式。

#include<stdio.h>
#include<stdlib.h>
#define MAX 100
typedef struct btree
{
    int data;
    struct btree *lchild;
    struct btree *rchild;
}BTREE;
typedef struct stack
{
    int top;
    BTREE *element[MAX];
}STACK;
typedef struct link
{
    BTREE *BT;
    struct link*next;
}LINK;
typedef struct queue
{
    LINK *front;
    LINK *rear;
}QUEUE;
int Empty(BTREE *BT);
// BTREE *Lchild(BTREE *BT);
// BTREE *Rchild(BTREE *BT);
void CreateBT(BTREE * &BT);
void PreOrder(BTREE *BT,FILE *fp);
void NPreOrder(BTREE *BT,FILE *fp);
void InOrder(BTREE *BT,FILE *fp);
void NInOrder(BTREE *BT,FILE *fp);
void PostOrder(BTREE *BT,FILE *fp);
void NPostOrder(BTREE *BT,FILE *fp);
void LevelOrder(BTREE *BT,FILE *fp);
int CompleteBitree(BTREE *BT);
int Width(BTREE *BT);
void Display(BTREE *BT);
void WriteFile(BTREE *BT,FILE *fp);
void MakeNull(STACK &S);
int Empty(STACK S);
BTREE * Top(STACK S);
void Pop(STACK &S);
void Push(BTREE *BT,STACK &S);
void MakeNull(QUEUE &Q);
int Empty(QUEUE Q);
BTREE *Front(QUEUE Q);
void EnQueue(BTREE *BT,QUEUE &Q);
void DeQueue(QUEUE &Q);
int main()
{
    BTREE *BT=NULL;
    FILE *fp=NULL;
    if((fp=fopen("btree.txt","a"))==NULL)
    {
        printf("Fail to open btree.txt!\n");
        exit(0);
    }
    CreateBT(BT);
    PreOrder(BT,fp);
    printf("\n");
    fprintf(fp,"\n");
    NPreOrder(BT,fp);
    InOrder(BT,fp);
    printf("\n");
    fprintf(fp,"\n");
    NInOrder(BT,fp);
    PostOrder(BT,fp);
    printf("\n");
    fprintf(fp,"\n");
    NPostOrder(BT,fp);
    LevelOrder(BT,fp);
    if(CompleteBitree(BT))
        printf("The bitree is a complete bitree!\n");
    else
        printf("The btree is not a complete bitree!\n");
    printf("Width of bitree is:%d",Width(BT));
    fclose(fp);
}
int Empty(BTREE *BT)
{
    if(BT==NULL)
        return 1;
    else
        return 0;
}
// BTREE *Lchild(BTREE *BT)
// {
//     if(BT->lchild!=NULL)
//         return BT->lchild;
//     else
//         return NULL;
// }
// BTREE *Rchild(BTREE *BT)
// {
//     if(BT->rchild!=NULL)
//         return BT->rchild;
//     else
//         return NULL;
// }
void CreateBT(BTREE * &BT)
{
    int num;
    scanf("%d",&num);
    if(num==-1) BT=NULL;
    else
    {
        BT=(BTREE *)malloc(sizeof(BTREE));
        BT->data=num;
        //Display(BT);
        CreateBT(BT->lchild);
        CreateBT(BT->rchild);
    }
}
void PreOrder(BTREE *BT,FILE *fp)
{
    if(!Empty(BT))
    {
        Display(BT);
        WriteFile(BT,fp);
        PreOrder(BT->lchild,fp);
        PreOrder(BT->rchild,fp);
    }
}
void NPreOrder(BTREE *BT,FILE *fp)
{
    printf("NPreOrder:");
    fprintf(fp,"NPreOrder:");
    BTREE *T=BT;
    STACK S;
    MakeNull(S);
    while(!Empty(S)||!Empty(T))
    {
        printf("%d ",T->data);
        fprintf(fp,"%d ",T->data);
        Push(T,S);
        T=T->lchild;
        while(Empty(T)&&!Empty(S))
        {
            T=Top(S);
            Pop(S);
            T=T->rchild;
        }
    }
    printf("\n");
    fprintf(fp,"\n");
}
void InOrder(BTREE *BT,FILE *fp)
{
    if(!Empty(BT))
    {
        InOrder(BT->lchild,fp);
        Display(BT);
        WriteFile(BT,fp);
        InOrder(BT->rchild,fp);
    }
}
void NInOrder(BTREE *BT,FILE *fp)
{
    printf("NInOrder:");
    fprintf(fp,"NInOrder:");
    BTREE *T=BT;
    STACK S;
    MakeNull(S);
    while(!Empty(T)||!Empty(S))
    {
        if(!Empty(T))
        {
            Push(T,S);
            T=T->lchild;
        }
        else
        {
            T=Top(S);
            Pop(S);
            printf("%d ",T->data);
            fprintf(fp,"%d ",T->data);
            T=T->rchild;
        }
        
    }
    printf("\n");
    fprintf(fp,"\n");
}
void PostOrder(BTREE *BT,FILE *fp)
{
    if(!Empty(BT))
    {
        PostOrder(BT->lchild,fp);
        PostOrder(BT->rchild,fp);
        Display(BT);
        WriteFile(BT,fp);
    }
}
void NPostOrder(BTREE *BT,FILE *fp)
{
    printf("NPostOrder:");
    fprintf(fp,"NPostOrder:");
    BTREE *T=BT;
    STACK S;
    int flag[MAX];
    MakeNull(S);
    while(!Empty(S)||!Empty(T))
    {
        if(!Empty(T))
        {
            Push(T,S);
            flag[S.top]=1;
            T=T->lchild;
        }
        else
        {
            if(flag[S.top]==1)
            {
                T=Top(S);
                flag[S.top]=2;
                T=T->rchild;
            }
            else
            {
                T=Top(S);
                printf("%d ",T->data);
                fprintf(fp,"%d ",T->data);
                Pop(S);
                T=NULL;
            }          
        }       
    }
    printf("\n");
    fprintf(fp,"\n");
}
void Display(BTREE *BT)
{
    printf("%d ",BT->data);
}
void WriteFile(BTREE *BT,FILE *fp)
{
    fprintf(fp,"%d ",BT->data);
}
void MakeNull(STACK &S)
{
    S.top=-1;
}
int Empty(STACK S)
{
    if(S.top<0)
        return 1;
    else
        return 0;
}
BTREE * Top(STACK S)
{
    if(Empty(S))
    {
        printf("Stack is empty!\n");
        return NULL;
    }
    else
    {
        return S.element[S.top];
    }
}
void Pop(STACK &S)
{
    if(Empty(S))
    {
        printf("Stack is empty!\n");
        return;
    }
    else
    {
        S.top=S.top-1;
    }
    
}
void Push(BTREE *BT,STACK &S)
{
    if(S.top==MAX-1)
    {
        printf("Stack is full!\n");
        return;
    }
    else
    {
        S.top=S.top+1;
        S.element[S.top]=BT;
    }
    
}
void MakeNull(QUEUE &Q)
{
    Q.front=(LINK *)malloc(sizeof(LINK));
    Q.front->next=NULL;
    Q.rear=Q.front;
}
int Empty(QUEUE Q)
{
    if(Q.front==Q.rear)
        return 1;
    else
        return 0;
}
BTREE *Front(QUEUE Q)
{
    if(Q.front->next)
        return Q.front->next->BT;
    else
    {
        printf("Queue is empty!\n");
        return NULL;
    }
}
void EnQueue(BTREE *BT,QUEUE &Q)
{
    Q.rear->next=(LINK *)malloc(sizeof(LINK));
    Q.rear=Q.rear->next;
    Q.rear->BT=BT;
    Q.rear->next=NULL;
}
void DeQueue(QUEUE &Q)
{
    if(Empty(Q))
    {
        printf("Queue is empty!\n");
        return;
    }
    else
    {
        LINK *temp=Q.front->next;
        Q.front->next=temp->next;
        free(temp);
        if(Q.front->next==NULL)
        {
            Q.rear=Q.front;
        }
    }
    
}
void LevelOrder(BTREE *BT,FILE *fp)
{
    BTREE *T=BT;
    QUEUE Q;
    MakeNull(Q);
    printf("LevelOrder:");
    fprintf(fp,"LevelOrder:");
    if(!Empty(T))
        EnQueue(T,Q);
    while(!Empty(Q))
    {
        T=Front(Q);
        DeQueue(Q);
        printf("%d ",T->data);
        fprintf(fp,"%d ",T->data);
        if(T->lchild)
            EnQueue(T->lchild,Q);
        if(T->rchild)
            EnQueue(T->rchild,Q);
    }
    printf("\n");
    fprintf(fp,"\n");
}
int CompleteBitree(BTREE *BT)
{
    QUEUE Q;
    MakeNull(Q);
    STACK S;
    MakeNull(S);
    BTREE *T=BT;
    if(T)
        EnQueue(T,Q);
    while(!Empty(Q))
    {
        T=Front(Q);
        DeQueue(Q);
        Push(T,S);
        if(T)
        {
            EnQueue(T->lchild,Q);
            EnQueue(T->rchild,Q);
        }
    }
    BTREE *temp;
    while(1)
    {
        temp=Top(S);
        Pop(S);
        if(temp)
            break;
    }
    while(1)
    {
        temp=Top(S);
        Pop(S);
        if(!temp)
            return 0;
    }
    return 1;
}
int Width(BTREE *BT)
{
    BTREE *T=BT;
    BTREE *queue[MAX];
    int front,rear,last;
    int temp_width=0,width=0;
    front=rear=last=0;
    if(!T)
        return 0;
    queue[rear++]=T;
    while(front!=rear)
    {
        T=queue[front++];
        temp_width++;
        if(T->lchild)
            queue[rear++]=T->lchild;
        if(T->rchild)
            queue[rear++]=T->rchild;
        if(front>=last)
        {
            last=rear;
            if(temp_width>width)
                width=temp_width;
            temp_width=0;
        }
    }
    return width;
}

2020年秋哈工大数据结构作业3源代码 2020年秋哈工大数据结构作业3树形结构及其应用源代码 立即下载

相关推荐

数据结构 建立二叉树二叉链表存储结构实现有关操作 实验报告

建立二叉树的二叉链表存储结构实现以下操作(选择其中的两个做) (1)输出二叉树 (2)先序遍历二叉树 (3) 中序遍历二叉树 (4)后序遍历二叉树 (5)层次遍历二叉树

哈工大数据结构作业3-树形结构及其应用

  本文是笔者2020年秋哈工大数据结构作业3自己的代码,由于本人能力有限,可能存在一些错误,欢迎指出。   本文仅供参考,严禁抄袭! 文章目录作业题目:二叉树存储结构的建立、遍历和应用编写建立二叉树的二叉链表存储结构(左右链表示)的程序,并以适当的形式显示和保存二叉树采用二叉树的二叉链表存储结构,编写程序实现二叉树的先序、中序和后序遍历的递归和非递归算法以及层序遍历算法,并以适当的形式显示和保存二叉树及其相应的遍历序列设计并实现判断任意一棵二叉树是否为完全二叉树的算法设计并实现计算任意一棵二叉树的宽度的(

qq_45853731的博客 1302

编写采用二叉链表形式存储的二叉树的创建、先序、中序、后序和按层遍历的算法

编写采用二叉链表形式存储的二叉树的创建、先序、中序、后序和按层遍历的算法。 编写将一棵二叉树的所有左右子树进行交换

哈工大数据结构实验二 树形结构及其应用

实验二 树形结构及其应用 实验内容:树型结构的建立与遍历 树型结构的遍历是树型结构算法的基础,本实验要求编写程序演示二叉树的存储结构的建立和遍历过程。 实验要求: (1) 至少用两种方法,编写建立二叉树的二叉链表存储结构的程序,并用广义表的形式显示并保存二叉树; (2) 采用二叉树的二叉链表存储结构,编写程序实现二叉树的先序、中序和后序遍历的递归和非递归算法以及层序遍

码蹄疾 3543

哈工大数据结构实验二_树形结构及其应用

实验项目:树型结构的建立、遍历和应用 实验题目:二叉树存储结构的建立、遍历和应用 实验内容: 树型结构的遍历是树型结构算法的基础,本实验要求编写程序演示二叉树 的存储结构的建立方法、遍历过程以及应用。 实验要求: 1.至少采用两种方法,编写建立二叉树的二叉链表存储结构(左右链表示)的 程序,并以适当的形式显示和保存二叉树; 2.采用二叉树的二叉链表存储结构,编写程序实现二叉树的先序、中序和后序 遍历的递归和非递归算法以及层序遍历算法,并以适当的形式显示和保存二叉树 及其相应的遍历序列; 3.设计并实现判断任意一棵二叉树是否为完全二叉树的算法。 4.设计并实现计算任意一棵二叉树的宽度的(递归或非递归)算法。二叉树的 宽度是指其各层结点数的最大值。 代码有详细注释

opencv去除印章痕迹

今天看到一个很有意思的程序,就是去除票据上的红色印章,觉得很有意思,就把它抄过来记录一下,同时自己也开了一下脑洞。 原来的程序来自:https://www.cnblogs.com/skyfsm/p/7638301.html 可以看到图像效果很不错,下面是源码实现: #include &lt;iostream&gt; #include &lt;opencv2/imgproc/imgpro...

zeng_haoyu的博客 7957

哈工大数据结构实验二——二叉树的建立、遍历及其应用

#include<iostream> #include<fstream> #include<stack> #include<queue> using namespace std; typedef struct BTnode *Tnode; //使用链式结构表示二叉树, struct BTnode{ //声明一个树的节点,它包含这个节点的数据以及指向左儿子和右儿子的指针 char data; Tnode lchild,rchild; //指向左

weixin_45406155的博客 3066

三菱FX5U运动控制(步进)

三菱FX5U脉冲定位控制,原点回归,相对定位,绝对定位,运动控制案例。

weixin_55762091的博客 1万+

《数据结构》实验报告-实验三 树形结构及其应用

本次实验主要学习了以二叉链表为存储结构的二叉树数据结构。在构建二叉树的过程中,不同的任务分别采取了两种“不同”的方式。第一种是通过输入带‘#’的先序序列来构建二叉树,因为带‘#’的序列唯一确定一棵二叉树,所以可以只利用先序序列的性质,按先序递归构建了二叉树;第二种是通过输入不带‘#’的后序序列和中序序列来构建二叉树,这个难度较大,需要经过一定的模拟和递归才能实现。第二种方式实质还是通过先序递归来构建二叉树,但是要通过对后序和中序序列的同时解析后才可以完成。

m0_46529566的博客 3494

STM32G474使用HRTIM触发多路ADC采样,通过DMA传输,通过串口打印显示,实现PWM中间时刻采样,避免开关噪声

本章工程使用HRTIM定时器进行ADC的触发,打开主定时器,子定时器A,B,C。(本工程未使用到A与C定时器,配置时可无需打开)主定时器配置:设置主定时器的频率为100KHz,并且设置自动更新以及自动重装载值。子定时器B设置:设置子定时器B为100KHz,并且每九次计数完成后产生一次中断。配置如上:1.打开自动预装载值2.打开自动复位3.设置死区时间以及互补PWM4.定时器复位触发更新寄存器5.定时器翻转重置更新6.重置触发源(定时器计数器在发生更新事件时重置)

weixin_41407439的博客 4909

从SIGGRAPH审稿人视角看:什么样的TOG论文更容易被接收?

本文从SIGGRAPH审稿人视角深入解析TOG论文的审稿标准与投稿策略,揭示如何提升论文接收概率。重点探讨创新性、技术深度、实验验证等核心评分维度,并提供写作技巧与审稿意见应对策略,帮助研究者优化ACM Transactions on Graphics投稿质量。

weixin_33721344的博客 108

关于哈工大数据结构实验的一些建议

工欲善其事必先利其器

qq_43858368的博客 911

国产麒麟系统下用Rider开发C#桌面应用:从环境配置到Avalonia UI实战

本文详细介绍了在国产麒麟系统上使用JetBrains Rider开发C#桌面应用的完整流程,重点讲解了Avalonia UI框架的实战应用。从环境配置、Rider安装到Avalonia项目创建和UI开发技巧,全面覆盖了在非Windows环境下进行C#开发的关键步骤和优化建议,助力开发者高效构建跨平台桌面应用。

weixin_27791839的博客 387

数据结构与算法 作业1——线性结构的存储结构与应用(Static LinkList)

哈工大数据结构与算法 作业1——线性结构的存储结构与应用的静态链表部分

xiaolaji5280的博客 574

RS485/CAN总线防护电路设计:TVS选型与ESD防护实战解析

本文深入解析了RS485与CAN总线防护电路设计中的TVS选型与ESD防护实战技巧。针对工业现场常见的静电放电、浪涌等干扰,文章详细阐述了TVS管关键参数的选择、多级防护体系的构建,并特别强调了在隔离电路设计中地回路处理的重要性,帮助工程师设计出更可靠的通信接口。

metaverse5vr的博客 386

从零解析特斯拉线圈:谐振变压器的核心原理与DIY实践

本文深入解析特斯拉线圈的工作原理与DIY实践,从LC振荡电路到电磁耦合,详细介绍了谐振变压器的核心原理。通过材料清单、绕制技巧和安全指南,帮助爱好者从零开始打造迷你闪电发生器,体验高压电子实验的独特魅力。

weixin_33670786的博客 493

数据结构与算法 作业1——线性结构的存储结构与应用(LinkList)

哈工大数据结构与算法 作业1——线性结构的存储结构与应用链式存储部分

xiaolaji5280的博客 489

【AI大模型应用开发】【LlamaIndex教程】2. 存储模块:如何在 LlamaIndex 中使用自定义的向量数据库?(附代码)

前面文章两行代码就实现了文档的切分和向量化存储以及持久化存储。如果我们想用自定义的向量化数据库呢?

同学小张的博客 2118

c语言第十五周答案,答案C语言版

2、第一章 习题答案 2 3 1 包含改变量定义的最小范围 2 数据抽象 信息隐蔽 3 数据对象 对象间的关系 一组处理数据的操作 4 指针类型 5 集合结构 线性结构 树形结构 图状结构 6 顺序存储 非顺序存储 7 一对一 一对多 多对多 8 一系列的操作 9 有限性 输入 可行性 4 1 A 2 C 3 C 5 语句频度为1 1 2 1 2 3 1 2 3 n 第二章 习题答案 1 1 一半...

weixin_39530838的博客 217

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

编译原理——笔记

计算机语言由底层到高层为机器语言、汇编语言、高级语言;机器语言是 CPU 可直接执行的二进制代码,汇编用助记符简化二进制、和硬件高度绑定,高级语言语法贴近人类自然语言;将汇编语言翻译成机器语言叫汇编;将高级语言整体翻译成汇编 / 机器码的过程是编译,另有解释型语言无需完整编译,且编译生成机器码后还需链接才能得到可运行程序。编译器的位置处于经过了预处理后的源程序到输出到汇编器之间,输入的是预处理后的源代码,输出的则是汇编器可以理解的汇编语言。

lastXuanGod的博客 222

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

二叉树的存储、遍历及应用

这里说说二叉树的两种存储方法:顺序存储和链式存储。 一、顺序存储 设二叉树深度为h,那么我们就按照深度为h的满二叉树的结点个数创建对应元素个数的数组,然后按照自上而下,从左到右的顺序,依次将树中结点存入数组即可。 例如下图所示: 我们需要存储一个深度为4的二叉树,所以先在脑海里构建如下相同深度的满二叉树,并且编号(对应数组下标,我这里从1开始,看官请自便)。 由于待存储二叉树的最后一个结点 h 对应满二叉树编号为 12 的结点,并且编号(即数组下标)是从1开始的,因此,我们创建一个长度为(12+1)的数

zhu_liucheng的博客 1232

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

数和二叉树——二叉树的建立及应用(遍历等)(基础篇)

二叉树:二叉树是每个结点最多有两个子树的有序树。 先来介绍一下二叉树的一些基本性质吧~ 二叉树的性质: 1.非空二叉树上叶子结点数等于双分支节点数加一。 性质1 二叉树第i层上的结点数目最多为2i-1(i≥1)。证明:用数学归纳法证明:  归纳基础:i=1时,有2i-1=20=1。因为第1层上只有一个根结点,所以命题成立。  归纳假设:假设对所有的j(1≤j&...

dianche1354的博客 524

数据结构 树型结构

编写建立二叉树的动态(或者静态)二叉链表存储结构(左右链表示)的程序,并以适当的形式显示和保存二叉树 等

qq_62585151的博客 571

数据结构实验一:树形结构

实验内容: 树型结构的遍历是树型结构算法的基础,本实验要求编写程序演示二叉树的存储结构的建立方法和遍历过程。 编写建立二叉树的二叉链表存储结构(左右链表示)的程序,并以适当的形式显示和保存二叉树; 采用二叉树的二叉链表存储结构,编写程序实现二叉树的先序、中序和后序遍历的递归和非递归算法以及层序遍历算法,并以适当的形式显示和保存二叉树及其相应的遍历序列; 给定一个二叉树, 编写算法完成下列应用:(二选一) a) 判断其是否为完全二叉树; b) 求二叉树中任意两个结点的公共祖先。 #include<c

llllllx0818的博客 1034

二叉树结构的建立与遍历

实验项目: 1.编写建立二叉树的二叉链表存储结构(左右链表示)的程序,并以适当的形式显示和保存二叉树; 2.完成二叉树的7种遍历操作 3.给定一个二叉树, 编写算法完成下列应用: (1)判断其是否为完全二叉树; (2)求二叉树中任意两个结点的公共祖先。 输入示例(空子树以'#'表示): ab##c##   #include &lt;stdio.h&gt; #include ...

George的博客 1497
上一篇: 软件构造blog5
下一篇: 哈工大 数据结构与算法 作业4-图型结构及其应用
TC_Ning
博客等级 码龄6年 21粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值