题目链接:http://acm.tju.edu.cn/toj/showp2801.html
Time Limit: 1.0 Seconds Memory Limit: 65536K
Total Runs: 2195 Accepted Runs: 804
We know that an expression can be uniquely represented by a binary tree. The suffix expression is the post-order traversal of this tree. Given the post-order traversal of a binary tree, each of whose non-leaf nodes has exactly two children, we can reconstruct the original binary tree if we are told which nodes in the post-order traversal are non-leaves. This means that no parenthesis is needed in the suffix expression.
Here is your task. Given a string S which represents the post-order traversal of a binary tree T in which all of the non-leaf nodes have exactly two children, and given which nodes in S are non-leaves, you must reconstruct the binary tree and output the in-order traversal of T.
Each node of T has a label, which is a letter('a'-'z', 'A'-'Z'). A lowercase letter('a'-'z') means the corresponding node is a leaf and an uppercase letter('A'-'Z') means the corresponding node is a non-leaf.
Input
The input contains an integer on the first line, which indicates the number of test cases. Each test case contains one string S on a line, the post-order traversal of a binary tree.Output
For each test case, output on a line one string which is the in-order traversal of the corresponding binary tree. There can be no white spaces in your output.Notes
Constraints
Sample Input
2 bcA efBghCA
Sample Output
bAc eBfAgCh
Source: The 5th UESTC Programming Contest
二叉树后序转中序,由于本题有限定条件为非叶子节点都有两个子节点,注意二叉树性质:n0=n2+1;然后就可以写了:
#include <stdio.h>
#include <iostream>
using namespace std;
string a;
void binTree(int s,int e){
if(s==e){
cout<<a[s];
return ;
}
int length=0,j;
for(j=e-1;j>=s;j--){
if(a[j]>='a'&&a[j]<='z')
length++;
else
length--;
if(length==1)
break;
}
binTree(s,j-1);
cout<<a[e];
binTree(j,e-1);
}
int main(){
int cast;
scanf("%d",&cast);
while(cast--){
cin>>a;
binTree(0,a.length()-1);
cout<<endl;
}
}