还原二叉树

简介: 数据结构

给定一棵二叉树的先序遍历序列和中序遍历序列,要求计算该二叉树的高度。

输入格式:
输入首先给出正整数N(≤50),为树中结点总数。下面两行先后给出先序和中序遍历序列,均是长度为N的不包含重复英文字母(区别大小写)的字符串。

输出格式:
输出为一个整数,即该二叉树的高度。

输入样例:
9
ABDFGHIEC
FDHGIBEAC
输出样例:
5
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <stack>
#include <queue>
using namespace std;

const int N=100;
typedef struct edge* node;

struct edge
{
    char data;
    node l;
    node r;
};

//通过先序序列和中序序列构造二叉树 
node insert(char *a, char *b, int n)
{
    int i;
    int n1=0, n2=0;
    int m1=0, m2=0;
    char la[N], ra[N];
    char lb[N], rb[N];
    node BT=NULL;
    if(n==0)
        return NULL;
    BT=(node) malloc(sizeof(struct edge));
    if(!BT)
        return NULL;
    memset(BT,0,sizeof(edge));
    BT->data=a[0];
    for(i=0;i<n;i++)
    {
        if(i<=n1&&(b[i]!=a[0]))
            lb[n1++]=b[i];
        else if(b[i]!=a[0])
            rb[n2++]=b[i];
    }
    for(i=1;i<n;i++)
    {
        if(i<=n1)
            la[m1++]=a[i];
        else
            ra[m2++]=a[i];
    }
    BT->l=insert(la, lb, n1);
    BT->r=insert(ra, rb, n2);
    return BT;
}

//通过后序序列和中序序列构造二叉树 
node push(char *a, char *b, int n)
{
    int i;
    int n1=0, n2=0;
    int m1=0, m2=0;
    char la[N], ra[N];
    char lb[N], rb[N];
    node BT=NULL;
    if(n==0)
        return NULL;
    BT=(node) malloc(sizeof(struct edge));
    if(!BT)
        return NULL;
    memset(BT,0,sizeof(edge));
    BT->data=a[n-1];
    for(int i=0;i<n;i++)
    {
        if(i<=n1&&(b[i]!=a[0]))
            lb[n1++]=b[i];
        else if(b[i]!=a[0])
            rb[n2++]=b[i];
    }
    for(i=0;i<n-1;i++)
    {
        if(i<=n1)
            la[m1++]=a[i];
        else
            ra[m2++]=a[i];
    }
    BT->l=push(la, lb, n1);
    BT->r=push(ra, rb, n2);
    return BT;
}

//先序遍历 
void Preorder(node BT)
{
    if(BT==NULL)
        return;
    printf("%c ", BT->data);
    Preorder(BT->l);
    Preorder(BT->r);
}

//非递归的先序遍历 
//void 

//中序遍历
void Inorder(node BT)
{
    if(BT==NULL)
        return;
    Inorder(BT->l);
    printf("%c ", BT->data);
    Inorder(BT->r);
}

//非递归的中序遍历
//void

//后序遍历
void Postorder(node BT)
{
    if(BT==NULL)
        return;
    Postorder(BT->l);
    Postorder(BT->r);
    printf("%c ", BT->data);
}

//非递归的后序遍历 
//void 

//层序遍历
void  Traversal(node BT)
{
    queue<char> q;
    if(!BT) return;
    q.push(BT->data);
    while(q.size())
    {
        printf("%c ", q.front());
        q.pop();
        if(BT->l) q.push(BT->l->data);
        if(BT->r) q.push(BT->r->data);
    }
}

//计算二叉树树高 
int high(node BT)
{
    if(BT)
    {
        int hl=high(BT->l);
        int hr=high(BT->r);
        int maxh=(hl>hr)?hl:hr;
        return maxh+1;
    }
    else return 0;
}

//输出二叉树的叶子结点 
void yezi(node BT)
{
    if(BT)
    {
        if(!BT->l&&!BT->r) 
            printf("%c ", BT->data);
        yezi(BT->l);
        yezi(BT->r);
    } 
} 


int main()
{
    int n;
    char a[N], b[N];
    node BT;
    BT=NULL;
    scanf("%d", &n);
    getchar();
    for(int i=0;i<n;i++)
        scanf("%c", &a[i]);
    getchar();
    for(int i=0;i<n;i++)
        scanf("%c", &b[i]);
    BT=insert(a, b, n);
    int t=high(BT);
    printf("%d\n", t);
    return 0;
} 
相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
相关文章
|
数据处理 Python
如何使用Python的Pandas库进行数据排序和排名
【4月更文挑战第22天】Pandas Python库提供数据排序和排名功能。使用`sort_values()`按列进行升序或降序排序,如`df.sort_values(by=&#39;A&#39;, ascending=False)`。`rank()`函数用于计算排名,如`df[&#39;A&#39;].rank(ascending=False)`。多列操作可传入列名列表,如`df.sort_values(by=[&#39;A&#39;, &#39;B&#39;], ascending=[True, False])`和分别对&#39;A&#39;、&#39;B&#39;列排名。
461 2
|
Java 数据库 Spring
【Spring Boot 快速入门】十六、Spring Boot项目中静态常量的定义方式
【Spring Boot 快速入门】十六、Spring Boot项目中静态常量的定义方式
1499 0
【Spring Boot 快速入门】十六、Spring Boot项目中静态常量的定义方式
|
10月前
|
机器学习/深度学习 人工智能 机器人
看过智谱现场演示,我觉得AI要开始卷“动手能力”了
2025年,AI Agent或成科技焦点。智谱在3月31日发布AutoGLM沉思,作为全球首个深度研究与操作兼备的Agent,无需邀请码即可免费使用。它能像人一样思考、感知和使用工具,完成复杂任务如写稿投稿、制定旅行计划等。基于自研模型GLM-4-Air-0414及推理模型GLM-Z1-Air,AutoGLM沉思实现低成本高效率,推动AI从被动响应走向主动执行。其开源计划将进一步加速AI Agent在各行业的应用落地,标志着“AI Agent元年”从口号变为现实。
344 0
|
机器学习/深度学习 人工智能 算法
探索人工智能在图像处理中的应用
【10月更文挑战第32天】本文将深入探讨人工智能(AI)如何在图像处理领域大放异彩,从基础的图像识别到复杂的场景解析,AI技术正逐步改变我们对视觉信息的理解和应用。文章将通过具体案例,揭示AI如何优化图像质量、实现风格迁移和进行内容识别,进而讨论这些技术背后的挑战与未来发展方向。
775 1
简约大气的个人导航网站源码
简约大气的个人导航网站源码
661 0
简约大气的个人导航网站源码
【简洁】三步开启QQ邮箱SMTP服务并获取授权码
【简洁】三步开启QQ邮箱SMTP服务并获取授权码
|
存储 算法 安全
深入解析RSA算法原理及其安全性机制
深入解析RSA算法原理及其安全性机制