ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

二叉树输出

2022-07-18 20:33:30  阅读:102  来源: 互联网

标签:输出 结点 return int maxn 二叉树


问题 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;
}

 

 

标签:输出,结点,return,int,maxn,二叉树
来源: https://www.cnblogs.com/bskys/p/16491852.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有