树的应用

news/2024/7/6 3:30:25 标签: 二叉树, 递归, 应用, 遍历, 算法

1、实验目的

通过本实验掌握二叉的建立和递归遍历、非递归遍历算法,了解二叉树在实际中的应用并熟练运用二叉树解决实际问题。

2、实验内容

根据前序遍历的顺序建立一棵二叉树,并根据遍历规则遍历二叉树

打印输出。

3、实验要求

1)根据前序遍历的顺序创建一棵二叉树

(2)对二叉树进行前序、中序、后序遍历

                        (非递归)

#include<stdio.h>
#include<stdlib.h>
typedef char datatype;
typedef struct node{        /*二叉树结构定义*/
    datatype data;
    struct node *lchild,*rchild;
}bintnode;
typedef bintnode *bintree;

typedef struct stack{        /*栈结构定义*/
    bintree data[100];
    int tag[100];        /*为栈中每个元素设置的标记,用于后序遍历*/
    int top;        /*栈顶指针*/
}seqstack;

void push(seqstack *s,bintree t)        /*进栈*/
{
    s->data[s->top]=t;
    s->top++;
}

bintree pop(seqstack *s)        /*出栈*/
{
    if(s->top!=0)
    {
        s->top--;
        return (s->data[s->top]);
    }
    else
        return NULL;
}

bintree createbintree()        /*根据前序遍历结果创建一棵给定的二叉树*/
{
    char ch;
    bintree t;
    scanf("%c",&ch);
    if(ch=='#')
        t=NULL;
    else
    {
        t=(bintnode *)malloc(sizeof(bintnode));
        t->data=ch;
        t->lchild=createbintree();
        t->rchild=createbintree();
    }
    return t;
}

void preorder1(bintree t)        /*二叉树前序遍历递归算法的实现*/
{
    seqstack s;
    s.top=0;
    while( (t) || (s.top!=0))        /*当前处理的子树不为空或栈不为空则循环*/
    {
        if(t)
        {
        printf("%c",t->data);
        push(&s,t);
        t=t->lchild;
        }
        else
        {
            t=pop(&s);
            t=t->rchild;
        }
    }
}

void inorder1(bintree t)        /*二叉树中序遍历递归算法的实现*/
{
    seqstack s;
    s.top=0;
    while(t!=NULL || (s.top!=0))
    {
        if(t)
        {
            push(&s,t);
            t=t->lchild;
        }
        else
        {
            t=pop(&s);
            printf("%c",t->data);
            t=t->rchild;
        }
    }
}

void postorder1(bintree t)        /*二叉树后序遍历递归算法的实现*/
{
    seqstack s;
    s.top=0;
    while((t) || (s.top!=0))
    {
        if(t)
        {
            s.data[s.top]=t;
            s.tag[s.top]=0;
            s.top++;
            t=t->lchild;
        }
        else
        {
            if(s.tag[s.top-1]==1)
            {
                s.top--;
                t=s.data[s.top];
                printf("%c",t->data);
                t=NULL;
            }
            else
            {
                t=s.data[s.top-1];
                s.tag[s.top-1]=1;
                t=t->rchild;
            }
        }
    }
}
int main()
{
    bintree t;
    printf("请输入一组字符,以‘#’作为结束:(如ABC##DE#G##F###(先序建立))\n");
    t=createbintree();
    printf("前序遍历二叉树:\n");
    preorder1(t);
    printf("\n");
    printf("中序遍历二叉树:\n");
    inorder1(t);
    printf("\n");
    printf("后序遍历二叉树:\n");
    postorder1(t);
    return 0;
}

                                  (递归)

#include<stdio.h>
#include<stdlib.h>
typedef char datatype;
typedef struct node{
    datatype data;
    struct node *lchild,*rchild;
}bintnode;
typedef bintnode *bintree;

bintree createbintree()
{
    char ch;
    bintree t;
    scanf("%c",&ch);
    if(ch=='#')
        t=NULL;
    else
    {
        t=(bintnode *)malloc(sizeof(bintnode));
        t->data=ch;
        t->lchild=createbintree();
        t->rchild=createbintree();
    }
    return t;
}

void preorder(bintree t)
{
    if(t)
    {
        printf("%c",t->data);
        preorder(t->lchild);
        preorder(t->rchild);
    }
}

void inorder(bintree t)
{
    if(t)
    {
        inorder(t->lchild);
        printf("%c",t->data);
        inorder(t->rchild);
    }
}

void postorder(bintree t)
{
    if(t)
    {
        postorder(t->lchild);
        postorder(t->rchild);
        printf("%c",t->data);
    }
}

int main()
{
    bintree t;
    printf("请输入一组字符,以‘#’作为结束:(如ABC##DE#G##F###(先序建立))\n");
    t=createbintree();
    printf("前序遍历二叉树:\n");
    preorder(t);
    printf("\n");
    printf("中序遍历二叉树:\n");
    inorder(t);
    printf("\n");
    printf("后序遍历二叉树:\n");
    postorder(t);
    return 0;
}




http://www.niftyadmin.cn/n/889896.html

相关文章

幽灵交易策略_老交易员直言爆过那么多仓:为什么我还是做不好交易(强烈推荐)...

老交易员直言爆过那么多仓&#xff1a;为什么我还是做不好交易(强烈推荐)学过那么多交易策略&#xff0c;爆过那么多仓&#xff1a;为什么我还是做不好交易&#xff1f;幽灵认为&#xff0c;知识和行为习惯改变&#xff0c;是做出正确交易必不可少的两个因素&#xff0c;这是他…

纸牌游戏——小猫钓鱼

一、游戏规则 将一副扑克牌平均分成两份&#xff0c;每人拿一份。小哼先拿出手中的第一张扑克牌放在桌上&#xff0c;然后小哈也拿出手中的第一张扑克牌&#xff0c;并放在小哼刚打出的扑克牌的上面&#xff0c;就像这样两人交替出牌。出牌时&#xff0c;如果某人打出的牌与桌上…

qt获取当前正在编辑的文件名和路径_qt 获取当前目录下的文件列表

Qt 获取程序运行路径//在需要的地方QString path;QDir dir;pathdir.currentPath();QMessageBox::warning(0,"PATH",path,QMessageBox::Yes);//查看路径//其他QString strExePath QApplication::applicationDirPath();QString strExePath QCoreApplication::applidc…

c++中 模板与重载入门代码

#include<iostream> using namespace std; template <typename T> //定义模板的固定格式 struct Point{T x,y; //成员变量Point(T x0,T y0):x(x),y(y){ //构造函数} }; template <typename T> //定义模板的固…

炸弹人游戏

一、游戏规则 你只有一枚炸弹&#xff0c;但是这枚炸弹威力超强&#xff08;杀伤距离超长&#xff0c;可以消灭杀伤范围内所有的敌人&#xff09;。请问在哪里放置炸弹才可以消灭最多的敌人&#xff1f; 二、题目分析 我们先将这个地图模型化。墙用#表示&#xff0c;敌人用G表示…

大理石在哪? 排序函数练习例题

大理石在哪儿 现有N个大理石&#xff0c;每个大理石上写了一个非负整数、首先把各数从小到大排序 然后回答Q个问题。每个问题问是否有一个大理石写着某个整数x&#xff0c;如果是&#xff0c;还要 回答哪个大理石上写着x。排序后的大理石从左到右编号为1~N。(在样例中&#xff…

火柴棍等式

一、问题描述 现在小明有n根火柴棍&#xff0c;希望拼出如 ABC 的等式。等式中的A、B、C均是用火柴棍拼出来的整数&#xff08;若该数非零&#xff0c;则最高位不能是0&#xff09;。数字0~9的拼法如图所示&#xff1a; 注意&#xff1a; 加号与等号各自需要两根火柴棍。如果 A…

VC6下OpenGL 开发环境的构建外加一个简单的二维网络棋盘绘制示例

一、安装GLUT 工具包 GLUT 不是OpenGL 所必须的&#xff0c;但它会给我们的学习带来一定的方便&#xff0c;推荐安装。 Windows 环境下的GLUT 本地下载地址&#xff1a;glut-install.zip&#xff08;大小约为150k&#xff09;。 也可直接去官方网站下载&#xff1a;http://www.…