viency13 2023-06-13 10:43 采纳率: 68.8%
浏览 9

请问我应该怎么判断输入不合法的情况呢

7-9 还原二叉树
分数 10
作者 王云武
单位 浙大城市学院
给出一颗二叉树的中序遍历和后序遍历,请你实现以下两个需求:

(1)请你输出这颗二叉树的层序遍历。

(2)请你输出这颗二叉树的树高。

输入格式:
第一行包含一个整数N(N<=1000)。二叉树的节点将从1到N编号。

第二行包含N个节点编号,表示这颗二叉树的中序遍历。

第三行包含N个节点编号,表示这颗二叉树的后序遍历。

输出格式:
第一行输出二叉树的层序遍历,节点编号之间用空格分隔,末尾没有多余空格。

第二行输出一个整数,代表二叉树的树高。

题目不保证输入的序列合法,如果遇到不合法的情况,请在一行中输出"ERROR",直接退出程序。

输入样例:
在这里给出一组输入。例如:

6
6 5 4 3 2 1
5 6 2 3 1 4
输出样例:
在这里给出相应的输出。例如:

4 6 1 5 3 2
4
输入样例:
在这里给出一组输入。例如:

3
2 1 3
3 2 1
输出样例:
在这里给出相应的输出。例如:

ERROR

#include <iostream>
using namespace std;
#define MAX 100000
typedef struct Tnode
{
    int data;
    Tnode *lchild, *rchild;
}Tnode, *Tree;

typedef struct
{
    Tree *base;
    int front;
    int rear;
}Queue;

int treehigh ( Tree T )
{
    if ( T == NULL )
    {
        return 0;
    }
    int len1 = treehigh (T->lchild);
    int len2 = treehigh (T->rchild);
    return len1 > len2 ? len1+1:len2+1;
}

void creat ( Tree &T, int *in, int *post, int n)
{
    T = new Tnode;
    if ( n == 0 )
    {
        return;
    }
    int i;
    T->data = post[n-1];
    for ( i = 0; i < n; i ++ )
    {
        if ( in[i] == T->data )
        {
            break;
        }
    }
    creat (T->lchild, in, post, i);
    creat (T->rchild, in+i+1, post+i, n-i-1);
} 

void init ( Queue &Q )
{
    Q.base = new Tree[MAX];
    Q.front = Q.rear = 0;
}
void enqueue ( Queue &Q, Tree e )
{
    Q.base[Q.rear] = e;
    Q.rear = Q.rear+1;
}

void dequeue( Queue &Q, Tree &p )
{
    if ( Q.front == Q.rear )
    {
         return;
    }
    p = Q.base[Q.front];
    Q.front = Q.front + 1;
}

void LevelOrder( Tree &T, Queue &Q, int n )
{
    int cnt = n;
    Tree p;
    p = new Tnode;
    enqueue (Q, T);
    while ( Q.front != Q.rear )
    {
         dequeue (Q, p);
        if ( p->data != 0 )
        {
            cout << p->data;
            if ( cnt > 1 )
            {
                cout << " ";
            }
            cnt --;
        }
         if ( p->lchild != NULL )
         {
              enqueue (Q, p->lchild); 
         }
         if ( p->rchild != NULL )
         {
              enqueue(Q, p->rchild);
         }
    } 
}

int main ()
{
    Tree T;
    int n;
    cin >> n;
    int a[n], b[n];
    for ( int i = 0; i < n; i ++ )
    {
        cin >> a[i];
    }
    for ( int i = 0; i < n; i ++ )
    {
        cin >> b[i];
    }
    int *in = a;
    int *post = b; 
    creat (T, in, post, n);
    Queue Q;
    init (Q);
    LevelOrder (T, Q, n);
    cout <<endl;
    int high = treehigh (T);
    cout << high-1<<endl;
}

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-06-13 12:44
    关注
    • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/7492818
    • 除此之外, 这篇博客: C语言实现八大排序算法详解及其性能之间的中的 名字已经暴露了他的算法,就是往里面插入数据,就拿我们生活中的例子来说,打扑克牌。我们往手里码牌的时候,是一张一张的码,先码一张,抓手心,不需要修改位置,因为只有一张牌,一定是有序的。再接一张,和手里的牌对比大小,调整位置,选择放在它的左边或者右边。然后接着码,又接到一张牌,拿到先和右边的牌比,比右边还大就放到最右边,如果比右边这张小呢,在和左边这张比。同样,我们这里也是这样的,首先我们默认第一个元素,一定是有序,OK吧。然后第二个,元素比较,大,放到左边,小放到右边。然后第三个元素,直到第N个,比它前一个大,继续往前找位置,直到找到对应位置了,就是有序数列了。(当然每次找位置都是在一个有序的序列中找,所以完全可以用二分查找找位置,数据大的话,二分明显快于我们一张一张比) 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
    • 算法思想

    评论

报告相同问题?

问题事件

  • 创建了问题 6月13日

悬赏问题

  • ¥15 在matlab中Application Compiler后的软件无法打开
  • ¥15 想问一下STM32创建工程模板时遇到得问题
  • ¥15 Fiddler抓包443
  • ¥20 Qt Quick Android 项目报错及显示问题
  • ¥15 而且都没有 OpenCVConfig.cmake文件我是不是需要安装opencv,如何解决?
  • ¥15 oracleBIEE analytics
  • ¥15 H.264选择性加密例程
  • ¥50 windows的SFTP服务器如何能批量同步用户信息?
  • ¥15 centos7.9升级python3.0的问题
  • ¥15 安装CentOS6时卡住