PAT (Advanced) 1086. Tree Traversals Again (25)

原题:1086. Tree Traversals Again (25)


解题思路:

实际上入栈顺序就是前序遍历,出栈顺序就是中序遍历,那么有了两个遍历就可以直接构造一个二叉树,后续遍历也就可以直接得到。



代码如下:

#include
#include
#include
#include
using namespace std;
const int maxn = 30 + 5;
struct Node
{
    int id;
    Node* lchild, *rchild, *parent;
    Node(){id = 0; lchild = NULL; rchild = NULL; parent = NULL;}
};

int preOrder[maxn], inOrder[maxn];

void build(Node* &root, int l1, int r1, int l2, int r2)
{
    if(l1 > r1) return ;
    root = new Node();
    root->id = preOrder[l1];
    int k;
    for(k = l2; k <= r2; k++)
        if(inOrder[k] == preOrder[l1]) break;
    int c = k - l2;
    build(root->lchild, l1+1, l1+c, l2, k-1);
    build(root->rchild, l1+c+1, r1, k+1, r2);
}


void postOrder(Node* root, int &first)
{
    if(root->lchild != NULL)
        postOrder(root->lchild, first);
    if(root->rchild != NULL)
        postOrder(root->rchild, first);
    if(first) {printf("%d", root->id); first = 0;}
    else printf(" %d", root->id);
}

int main()
{
    int n;
    while(scanf("%d", &n) == 1)
    {
        stack sta;
        int cnt = 0, cPre = 0, cIn = 0;
        while(cnt < n)
        {
            char cmd[5];
            int x;
            scanf("%s", cmd);
            if(cmd[1] == 'u')
            {
                scanf("%d", &x);
                sta.push(x);
                preOrder[cPre++] = x;
            }
            else
            {
                inOrder[cIn++] = sta.top();
                sta.pop();
                cnt++;
            }
        }
        Node* root = NULL;
        build(root, 0, n-1, 0, n-1);
        int first = 1;
        postOrder(root, first);
        printf("\n");
    }
    return 0;
}

你可能感兴趣的:(PAT)