UVA548 中序后序构造二叉树


详见紫书p157

代码:

#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <vector>
#include <sstream>
using namespace std;
const int maxn = 10010;
const int inf = 0x3f3f3f3f;
int n;
int inOrder[maxn],postOrder[maxn];
struct node{
    int value;
    node *left,*right;
    node():left(NULL), right(NULL){};
}*root;
node *newNode(){
    return new node();
}
bool read(int *a){
    string line;
    if(!getline(cin, line)) return false;
    stringstream t;
    t<<line;
    n = 0;
    int x;
    while (t>>x) {
        a[n++] = x;
    }
    return n>0;
}
void removeTree(node *u){
    if(u==NULL){
        return;
    }
    removeTree(u->left);
    removeTree(u->right);
    delete u;
}
node *build(int l1, int r1, int l2, int r2){
    if(l1>r1) return NULL;
    node *index = newNode();
    int father = postOrder[r2];
    index->value = father;
    int p = l1;
    while(inOrder[p]!=father){
        p++;
    }
    int leftChildern = p-l1;
    index->left = build(l1, p-1, l2, l2+leftChildern-1);
    index->right = build(p+1, r1, l2+leftChildern, r2-1);
    return index;
}
int now,nowSum;
void dfs(node *u, int sum){
    sum += u->value;
    if(u->left==NULL&&u->right==NULL){
    if(sum<nowSum || (sum==nowSum&&u->value<now)){
            now = u->value;
            nowSum = sum;
        }
    }

    if(u->left!=NULL) dfs(u->left, sum);
    if(u->right!=NULL) dfs(u->right, sum);
}
int main(){
    while(read(inOrder)){
        read(postOrder);
        root = build(0, n-1, 0, n-1);
        nowSum = inf;
        dfs(root, 0);
        printf("%d\n",now);
        removeTree(root);
    }
    return 0;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值