二叉树ADT的二叉链表求解

2023-10-31

假设二叉数的数据元素为字符,采用二叉链式存储结构。请编码实现二叉树ADT,其中包括创建二叉树、遍历二叉树(深度、广度)、求二叉树的深度(高度)、计算二叉树的元素个数、计算二叉树的叶子数、二叉树的格式输出等。

根据输入的符号,执行相应的操作。如下:

C:创建二叉树,创建成功输出 “Created success!”。要求实现两种创建算法。输入数字“1" ,是根据完全前序序列创建二叉树,#表示空结点(空子树);下一行输入二叉树的完全前序序列。 输入数字“2”,是根据二叉树的前序和中序序列创建二叉树,后面有三行,分别输入元素个数、前序序列和后序序列。

H:求二叉树的高度;   输出: Height=高度
L:计算二叉树的叶子数;输出:Leaves=叶子个数

N:计算二叉树中元素总个数;输出:Nodes=结点个数

1:先序遍历二叉树;输出:Preorder is:序列 .

2:中序遍历二叉树;输出:Inorder is:序列 .

3:后序遍历二叉树;输出:Postorder is:序列 .

4:广度遍历二叉树;输出:BFSorder is:序列 .

F:查找值为x的结点个数;输出:The count of x is 个数 .

P:以目录缩格文本形式输出所有节点。输出:The tree is:(换行,下面各行是输出的二叉树)

X:退出

例如:

输入 Result
C
1
ABC##DE#G##F###
H
L
N
1
2
3
4
F
A
P
X
Created success!
Height=5
Leaves=3
Nodes=7
Preorder is:A B C D E G F .
Inorder is:C B E G D F A .
Postorder is:C G E F D B A .
BFSorder is:A B C D E F G .
The count of A is 1
The tree is:
A
  B
    C
    D
      E
        G
      F
#include <iostream>
#include <queue>
#include <stack>
using namespace std;
int cnt=0,leaves=0,nodes=0;
typedef struct node
{
    struct node *lchild,*rchild;
    char data;
} BiNode,*BiTree;

void creat(BiTree &T)///前序
{
    char c;
    cin>>c;
    if(c=='#')
    {
        T=NULL;
    }
    else
    {
        T= new BiNode();
        T->data=c;
        creat(T->lchild);
        creat(T->rchild);
    }
}

///由前序序列和中序序列建立二叉树的过程
/* 算法
1、通过先序遍历找到根结点A,再通过A在中序遍历的位置找出左子树,右子树
2、在A的左子树中,找左子树的根结点(在先序中找),重新开始步骤1
3、在A的右子树中,找右子树的根结点(在先序中找),重新开始步骤1
*/
BiTree creat1(char *pre, char *in, int n)//pre存放前序序列,in存放中序序列,n为序列的长度
{
    int i=0;
    int n1=0,n2=0;
    int m1=0,m2=0;
    BiTree node = NULL;
    char lchild_pre[100],rchild_pre[100] ;//lchild_pre[N] 存放前序序列中的左子树;rchild_pre[N]存放前序序列中的右子树
    char lchild_in[100],rchild_in[100]; //lchild_in[N]存放中序序列中的左子树;rchild_in[N]存放中序序列中的右子树
    if(n==0)
    {
        return NULL;
    }
    node = new BiNode();
    if(node==NULL)
    {
        return NULL;
    }
    node->data = pre[0]; //前序序列的第一个元素一定是根节点
    for(i=0; i<n; i++)
    {
        //求前序序列中的左子树和右子树
        if((i<=n1)&&(in[i]!=pre[0]))
        {
            lchild_in[n1++]=in[i];
        }
        else if(in[i]!=pre[0])
        {
            rchild_in[n2++] = in[i];
        }
    }
    for(i=1; i<n; i++)
    {
        //求中序序列中的左子树和右子树
        if(i<(n1+1))
        {
            lchild_pre[m1++]=pre[i];
        }
        else
        {
            rchild_pre[m2++]=pre[i];
        }
    }
    //使用递归,分别插入左子树和右子树
    node->lchild =creat1(lchild_pre,lchild_in,n1);
    node->rchild =creat1(rchild_pre,rchild_in,n2);
    return node;


}


void Preorder(BiTree T)  ///前序遍历
{
    if(T!=NULL)
    {
        cout<<T->data<<' ';
        Preorder(T->lchild);
        Preorder(T->rchild);
    }
}
void Inorder (BiTree T)  ///中序遍历
{
    if(T!=NULL)
    {
        Inorder(T->lchild);
        cout<<T->data<<' ';
        Inorder(T->rchild);
    }
}
void Postorder(BiTree T)  ///后序遍历
{
    if(T!=NULL)
    {
        Postorder(T->lchild);
        Postorder(T->rchild);
        cout<<T->data<<' ';
    }
}

void BFSorder(BiTree T)  ///广序遍历
{
    if(T!=NULL)
    {
        queue<BiTree>my;
        BiTree p=T;
        my.push(p);
        while(!my.empty())
        {
            p=my.front();
            cout<<p->data<<' ';
            my.pop();
            if(p->lchild!=NULL)
            {
                my.push(p->lchild);
            }
            if(p->rchild!=NULL)
            {
                my.push(p->rchild);
            }
        }
    }
}
void Find(BiTree T,char ch=' ')  ///广序遍历  只查找不输出
{
    leaves=0;nodes=0;
    if(T!=NULL)
    {
        queue<BiTree>my;
        BiTree p=T;
        my.push(p);
        while(!my.empty())
        {
            p=my.front();
            nodes++;
            if(p->data==ch) cnt++;
            my.pop();
            if(p->lchild!=NULL)
            {
                my.push(p->lchild);
            }
            if(p->rchild!=NULL)
            {
                my.push(p->rchild);
            }
            if(p->lchild==NULL&&p->rchild==NULL)
            {
                leaves++;
            }
        }
    }
}

int getHeight(BiTree T)
{
    if(T==NULL)
    {
        return 0;
    }
    int leftheight=getHeight(T->lchild);
    int rightheight=getHeight(T->rchild);
    return max(leftheight, rightheight)+1;
}
void Print(BiTree T)    /*用缩格文本形式表示二叉树*/
{
   BiTree stack[100],p;

   int level[100],top,n,i;

   if (T)

    {

       top=1;

       stack[top]=T;

       level[top]=0;

       while(top>0)

       {
           p=stack[top];
           n=level[top];
           for (i=1; i<=n; i++)
                cout<<" ";
           cout<<p->data<<endl;
           top--;
           if (p->rchild!=NULL)
           {
                top++;
                stack[top]=p->rchild;
                level[top]=n+2;
           }

           if (p->lchild!=NULL)
           {
                top++;
                stack[top]=p->lchild;
                level[top]=n+2;
           }
       }
}
}
int main()
{
    char ch;
    BiTree T;
    while(1)
    {
        cin>>ch;

        switch (ch)
        {
        case 'C':
            char ch1;
            cin>>ch1;
            if(ch1=='1')
            {
                creat(T);
                cout<<"Created success!"<<endl;
            }
            else
            {
                int n;
                char ch[50],ch1[50];
                cin>>n;
                cin>>ch;
                cin>>ch1;
                T=creat1(ch,ch1,n);
                cout<<"Created success!"<<endl;
            }
            break;
        case 'H':
            cout<<"Height="<<getHeight(T)<<endl;
            break;
        case 'L':
            Find(T);
            cout<<"Leaves="<<leaves<<endl;
            break;
        case 'N':
            Find(T);
            cout<<"Nodes="<<nodes<<endl;
            break;
        case '1':
            cout<<"Preorder is:";
            Preorder(T);
            cout<<'.'<<endl;
            break;
        case '2':
            cout<<"Inorder is:";
            Inorder(T);
            cout<<'.'<<endl;
            break;
        case '3':
            cout<<"Postorder is:";
            Postorder(T);
            cout<<'.'<<endl;
            break;
        case '4':
            cout<<"BFSorder is:";
            BFSorder(T);
            cout<<'.'<<endl;
            break;
        case 'F':
            char ch2;
            cin>>ch2;
            Find(T,ch2);
            cout<<"The count of "<<ch2<<" is "<<cnt<<endl;
            break;
        case 'P':
            cout<<"The tree is:"<<endl;
            Print(T);
            break;
        case 'X':
            return 0;
        }
    }
    return 0;
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

二叉树ADT的二叉链表求解 的相关文章

  • QuaggaJS在给定图像中定位条形码的工作原理

    QuaggaJS在给定图像中定位条形码的工作原理 一 介绍 二 步骤 1 创建图像的二进制表示 2 将图像切成网格 20 x 15个单元 3 提取每个细胞的骨架 4 组件标记 5 确定组件的方向 6 测定细胞质量 7 查找连接的单元格 8

随机推荐

  • PDF去水印教程

    现在的互联网时代是一个共享的时代 我们一定会经常从网络上面下载一些文件资料等等 那么是不是经常会遇到一些网站上的PDF文件会含有该网站的水印或者网址链接等等 这些水印有时候会影响我们正常的阅读文件 那么我们就需要将他们都去掉 接下来我们就是
  • java利用条件运算符的嵌套来完成此题:学习成绩> =90分.....(java50道经典编程题)

    题目 利用条件运算符的嵌套来完成此题 学习成绩 gt 90分的同学用A表示 60 89分之间的用B表示 60分以下的用C表示 这是一个写条件运算的例子 先和大家聊一下条件运算符 所谓条件运算也是比较简单的格式如下 基本格式 条件 值1 值2
  • AD9910模块高速DDS模块、功能性能讲解、开发调试注意事项、代码详解、电子设计大赛DDS

    AD9910模块高速DDS模块 STM32 驱动代码 功能性能讲解 开发调试注意事项 代码详解 电子设计大赛DDS 目录 AD9910模块高速DDS模块 STM32 驱动代码 功能性能讲解 开发调试注意事项 代码详解 电子设计大赛DDS 1
  • 稀疏数组和二维数组转换(以及持久化io实现)

    稀疏数组 1 当一个数组中大部分元素为0 或者为同一值的数组时 可以使用稀疏数组来保存数组 2 稀疏数组的处理方式是 a 记录数组一共有几行几列 有多少个不同值 b 把具有不同值元素的行 列及值记录在一个小规模的数组中 从而缩小程序的规模
  • 遥感影像深度学习样本制作

    交流QQ 3239516597 对于遥感同学 在学习深度学习时 第一步就要解决遥感数据样本的制作 遥感影像数据的样本根据不同的应用也有所不同 不知道的同学可以去看视频 遥感深度学习样本制作视频1 今天介绍一下如果已经有了遥感影像和对应的类别
  • 地址栏输入 URL 敲下回车后发生了什么

    浏览器地址栏输入 URL 回车后发生了什么 一 总结分析 分析如下 从输入 URL到回车后发生的行为如下 URL解析 DNS 查询 TCP 连接 HTTP 请求 响应请求 页面渲染 URL解析 首先判断你输入的是一个合法的URL 还是一个待
  • 定位排查Java线上内存溢出问题(服务重启,没有捕获到日志)

    一 场景 线上项目device服务模块内存不断上涨导致CPU较高 导致触发脚本执行重启 接口自动化测试平台不断的报500拒绝连接等错误提示 排查 通过服务器日志查询并没有异常错误信息打印 查看docker容器的日志发现错误是打印控制台 无法
  • 简单工厂模式

    定义 定义一个工厂类 它可以根据传入的参数返回不同类的实例 被创建的类实例通常都具有相同的父类 因为在简单工厂模式中返回所创建的类实例的方法是静态方法 所以简单工厂模式也称为静态工厂模式 简单工厂方法的要点在于 你只需要传入一个正确的参数
  • 安装Yearning SQL审核平台和Inception(基于已闭源方式)

    这是我安装Yearning SQL审核平台和Inception 已闭源 总结的文档 1 安装centos7并配置网络为桥接模式 命令 vi etc sysconfig network scripts ifcfg ens33 内部配置如下 2
  • 硬件学习--不同硬盘类型速度对比

    SATA 串行ATA总线 SCSI 小型电脑输入输出接口 SAS 希捷研究出来的取代SCSI技术的接口 SSD 固态硬盘 容量小 读写快 接口速度是 SSD gt SAS gt SCSI gt SATA SAS Serial Attache
  • 通用Ajax设计

    利用Servlet和反射技术实现通用的Ajax调用设计 如下 一 调用规则 在JS代码 调用者只需按下面的规范 即可实现异步或同步java方法调用 在你的jsp或html页面中 导入通用异步调用方法文件 km js 自定义 然后写异步调用方
  • unity中使用c#钩子

    目的 解决在应用程序最小化后无法监听到系统按键事件的情况 解决问题的过程很好笑 我先找到了第一个方法 脚本一 使用方法 脚本挂在场景中物体上即可 using System using System Collections using Sys
  • 统计学习第四弹--随机变量的概率分布

    关于随机变量概率分布的重要概念 概率 对事件的发生的可能性大小的度量值 随机变量 事先不能确定其取值的变量 离散型随机变量 只能取有限个值的随机变量 连续型随机变量 可以取一个或多个区间中任何值的随机变量 期望值 随机变量的平均取值 求法是
  • Caltech数据使用详情

    Caltech官网 http www vision caltech edu Image Datasets CaltechPedestrians 以Caltech测试集为例 大概是4095个图片吧 1 下载数据 http www vision
  • 【华为OD机试】返回矩阵中非1的元素个数【2023 B卷

    华为OD机试 真题 点这里 华为OD机试 真题考点分类 点这里 题目描述 存在一个m n的二维数组 其成员取值范围为0 1 2 其中值为1的元素具备同化特性 每经过1S 将上下左右值为0的元素同化为1 而值为2的元素 免疫同化 将数组所有成
  • C语言小知识-不定参数函数实现

    C语言不定参数的实现 C语言在定义函数参数时 允许参数的使用数量可变 这在C语言中称为 可变参数函数 variadic function 当然在C标准库中不乏可变参数函数的使用 例如 C标准函数 printf 的声明方式为 int prin
  • Qt之设置QWidget背景色(QStyleOption->drawPrimitive(QStyle::PE_Widget)

    QWidget是所有用户界面对象的基类 这意味着可以用同样的方法为其它子类控件改变背景颜色 Qt中窗口背景的设置 下面介绍三种方法 1 使用QPalette 2 使用Style Sheet 3 绘图事件 一般我不用QSS设置窗口背景 也不建
  • 在YOLOv5训练自己的数据集模型时删除预训练权重后发现报错

    上图是报错内容 找到general py 出错的位置 应该是YOLOv5版本的问题 就用一个可以正常空权重跑通的文件 将general py相应部分给复制下来 粘贴过去 报错内容是 acceptable suffix is pt
  • 【超简易版】基于Pytorch Fasterrcnn_resnet50_fpn的多车牌定位/车牌检测-基于CCPD2019数据集

    说明 本项目为本人初学torch框架练习项目 在此仅作个人经验分享 由于本人现大三 码code经验有限 难免存在瑕疵 望各位前辈批评指正 本项目在linux上训练模型并下载权重 pth文件在windows上进行测试 数据集来源参考 CCPD
  • 二叉树ADT的二叉链表求解

    假设二叉数的数据元素为字符 采用二叉链式存储结构 请编码实现二叉树ADT 其中包括创建二叉树 遍历二叉树 深度 广度 求二叉树的深度 高度 计算二叉树的元素个数 计算二叉树的叶子数 二叉树的格式输出等 根据输入的符号 执行相应的操作 如下