二叉树输出

问题 E: 二叉树输出


时间限制: 1.000 Sec  内存限制: 128 MB

题目描述

树的凹入表示法主要用于树的屏幕或打印输出,其表示的基本思想是兄弟间等长,一个结点要不小于其子结点的长度。二叉树也可以这样表示,假设叶结点的长度为1,一个非叶结点的长并等于它的左右子树的长度之和。

一棵二叉树的一个结点用一个字母表示(无重复),输出时从根结点开始:

每行输出若干个结点字符(相同字符的个数等于该结点长度),

如果该结点有左子树就递归输出左子树;

如果该结点有右子树就递归输出右子树。

假定一棵二叉树一个结点用一个字符描述,现在给出先序和中序遍历的字符串,用树的凹入表示法输出该二叉树。

输入

共两行,每行是由字母组成的字符串(一行的每个字符都是唯一的),分别表示二叉树的先序遍历和中序遍历的序列。

输出

行数等于该树的结点数,每行的字母相同。

样例

输入 
ABCDEFG
CBDAFEG
输出 
AAAA
BB
C
D
EE
F
G
代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e7;
int n;
int v[maxn],l[maxn],r[maxn];

int ans ;
int is ;

void f(int x,int y){    
    if(x == -1 && y == -1){                
        return ;
    }
    if(x == -1 || y == -1 || v[x] != v[y]){ 
        is = 0;                            
        return ;
    }
    f(l[x],r[y]);                                                
    f(r[x],l[y]);                    
}

int cnt(int x){
    int k=1;
    if(l[x] != -1 ){
        k += cnt(l[x]); 
    }
    if(r[x] != -1 ){
        k += cnt(r[x]);
    }    
    return k;
}
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%d",&v[i]);
    }
    for(int i=1;i<=n;i++){
        scanf("%d%d",&l[i],&r[i]);}
    for(int i=1;i<=n;i++){
         is = 1;
        f(l[i],r[i]);
        if(is){ 
            ans = max(ans,cnt(i));
        }
    }
    cout<<ans<<endl;
    return 0;
}

 

 
posted @ 2022-07-18 20:21  ciciio  阅读(51)  评论(0编辑  收藏  举报