您的位置:首页 > 其它

UVA548 中序后序构造二叉树

2017-04-20 20:08 477 查看


详见紫书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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: