由中根序列和后根序列重建二叉树

http://dsalgo.openjudge.cn/binarytree/4/

总时间限制: 500ms 内存限制: 65535kB

描述
本题输入一棵二叉树的中根序列和后根序列,要求在内存中重建二叉树,最后输出这棵二叉树的前根序列。

用不同的整数来唯一标识二叉树的每一个结点,下面的二叉树

这里写图片描述

中根序列是9 5 32 67

后根序列9 32 67 5

前根序列5 9 67 32

输入

两行。第一行是二叉树的中根序列,第二行是后根序列。每个数字表示的结点之间用空格隔开。结点数字范围0~65535。暂不必考虑不合理的输入数据。

输出
一行。由输入中的中根序列和后根序列重建的二叉树的前根序列。每个数字表示的结点之间用空格隔开。

样例输入
9 5 32 67
9 32 67 5
样例输出
5 9 67 32



#include <iostream>
using namespace std;
#define MAX 63556
int zhong[MAX];
int hou[MAX];

int find_root(int back, int rootn){//在后序中找到树中的左半边子树的root

    // rootn是树的root
    // back是树的右半边子树的节点个数

    return hou[rootn-back-1];
}

void build_tree(int begin, int num, int root, int rootn){
    //cout<<begin<<" "<<num<<" "<<root<<endl;

    // begin: 子树前序和后序打头的序号,两者相同
    // num:  子树的长度
    // root: 子树的根
    // rootn:  子树的根在后序当中的序号

    cout<<root<<" ";
    if (num<=1){return;}

    int j=1;
    int temp=begin;
    while(zhong[temp]!=root){ temp++; j++;}
    j--;
    int r=num-1-j;
    if (r<0) return;

    // temp是中序当中的root位置
    // j是root前面的个数
    //r是剩下的个数

    int a = find_root(r,rootn);
    // 在后序中找到左半边的root=a

    build_tree(begin,j,a,rootn-r-1);
    // 对左半边的进行递归

    if (r>0){

        a= hou[rootn-1];
        // 找到右半边的root

        build_tree(temp+1,r,a,rootn-1);}
       // 对右半边的进行递归

}

这里写图片描述


int main(){


    int i=0;
    while(cin>>zhong[i++]){
        if (cin.get()!=' ') break;
    }
    //cin是跳过“空白”的;但是cin完一个数之后,“光标”还是在“空白”前面,cin.get()可以取到这个空白*
    i=0;
    while(cin>>hou[i++]){
        if (cin.get()!=' ') break;
    }

    // i等于数字的个数
    build_tree(0,i,hou[i-1],i-1);
    cout<<endl;
        return 0;
}
  • 7
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值