4-14 还原二叉树 (15分)&4-15 根据后序和中序遍历输出先序遍历

4-14 还原二叉树 (15分)

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

输入格式:

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

输出格式:

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

输入样例:

9
ABDFGHIEC
FDHGIBEAC

输出样例:

5

代码
#include<iostream>
#include<algorithm>
#include<string>
#include<bits/stdc++.h>
using namespace std;
char pre[10001],in[10001];
struct Binode{
    char data;
    struct Binode *left,*right;
};
typedef struct Binode *Bitree;
void prein(int i,int j,int m,int k,Bitree *root);
void preinCreat(int n,Bitree *root){
    if(n<=0) return ;
    else prein(0,n-1,0,n-1,root);
}
void prein(int i,int j,int m,int k,Bitree *root){
    *root=(struct Binode*)malloc(sizeof(struct Binode));
    (*root)->data=pre[i];
    int p=m;
    while(in[p]!=pre[i])  p++;
    if(p==m) (*root)->left==NULL;
    else prein(i+1,i+p-m,m,p-1,&((*root)->left));
    
    if(p==k) (*root)->right==NULL;
    else prein(i+p-m+1,j,p+1,k,&((*root)->right));
}
int getH(Bitree bt){
    int r,l,h;
    if(bt){
        r=getH(bt->right);
        l=getH(bt->left);
        h=r>l?r:l;
        return h+1;
    }else return 0;
}
int main(){
    int N;
    cin>>N;
    scanf("%s%s",pre,in);
    Bitree tree;
    preinCreat(N,&tree);
    printf("%d",getH(tree));
}

4-15 根据后序和中序遍历输出先序遍历 (15分)

本题要求根据给定的一棵二叉树的后序遍历和中序遍历结果,输出该树的先序遍历结果。

输入格式:

第一行给出正整数N(≤30),是树中结点的个数。随后两行,每行给出N个整数,分别对应后序遍历和中序遍历结果,数字间以空格分隔。题目保证输入正确对应一棵二叉树。

输出格式:

在一行中输出Preorder:以及该树的先序遍历结果。数字间有1个空格,行末不得有多余空格。

输入样例:

7
2 3 1 5 7 6 4
1 2 3 4 5 6 7

输出样例:

Preorder: 4 1 3 2 6 5 7

#include<iostream>
#include<algorithm>
#include<bits/stdc++.h>
using namespace std;
int post[10001],in[10001];
typedef struct Node{
    int Data;
    struct Node *left,*right;
}tNode,*Tree;

void poinCreat(int i,int j,int m,int n,Tree *root);
void Creat(int n,Tree *root){
    if(n<=0) return ;
    else poinCreat(0,n-1,0,n-1,root);
}
void poinCreat(int i,int j,int m,int n,Tree *root){
    *root=(tNode*)malloc(sizeof(tNode));
    (*root)->Data=post[j];
    int k=m;
    while(post[j]!=in[k])  k++;
    if(k==m) (*root)->left=NULL;
    else poinCreat(i,i+k-m-1,m,k-1,&(*root)->left);
    
    if(k==n) (*root)->right=NULL;
    else poinCreat(i+k-m,j-1,k+1,n,&(*root)->right);
}
void preprint(Tree root){
    if(root){
        printf(" %d",root->Data);
        preprint(root->left);
        preprint(root->right);
    }
    else return ;
}
int main(){
    Tree tr;int N;
    cin>>N;
    for(int i=0;i<N;i++){
        cin>>post[i];
    }
    for(int i=0;i<N;i++){
        cin>>in[i];
    }
    Creat(N ,&tr);
    printf("Preorder:");
    preprint(tr);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值