POJ_2255

来源:互联网 发布:淘宝html模板 编辑:程序博客网 时间:2024/06/05 05:31

解题:

    比较直接,由二叉树pre-order和in-order求后序, 可以重构树再遍历,更好的方法是找到三种序列的关系,直接求解(先左后右, 不断的找到子树的根,然后压到结果栈,最后出栈次序就是后序遍历)。

注意:

    1. 从效率考虑,应该用栈迭代,而不要用递归。

    2. 最后遍历结果栈的时候,犯了很2的错误,debug好9,一定吸取教训。


//144k  0ms#include <cstdio>#include <cstdlib>#include <cstring>#include <stack>#include <string>#include <algorithm>using namespace std;struct Tree {  int p_st, p_end, in_st, in_end;};char pre[27], in[27];int main() {  while (scanf("%s %s", pre, in) != EOF) {    stack<char> post;    stack<Tree> tree_stack;    Tree tree = {0, strlen(pre) - 1, 0, strlen(in) - 1};    tree_stack.push(tree);    while (tree_stack.size()) {      tree = tree_stack.top();      tree_stack.pop();      if (tree.p_st <= tree.p_end && tree.in_st <= tree.in_end) {        post.push(pre[tree.p_st]);        for (int i = tree.in_st; i <= tree.in_end; ++i) {          if (in[i] == pre[tree.p_st]) {            Tree left = {tree.p_st + 1, tree.p_st + i - tree.in_st,               tree.in_st, i - 1};            tree_stack.push(left);            Tree right = {tree.p_st + i - tree.in_st + 1, tree.p_end,              i + 1, tree.in_end};             tree_stack.push(right);            break;          }        }      }    }    for ( ; post.size(); post.pop())      printf("%c", post.top());    printf("\n");  }  return 0;}



原创粉丝点击