1086. Tree Traversals Again (25)-树的遍历

题意:用栈的push、pop操作给出一棵二叉树的中序遍历顺序,求这棵二叉树的后序遍历。

需要一个堆结构s,一个child变量(表示该节点是其父亲节点的左孩子还是右孩子),父亲节点fa
对于push v操作:
1).第一个push肯定是根节点root。
2).根据child变量,建立fa与v的父子关系。
3).由于是中序遍历,所以接下来的节点必定是v的left(如果有的话),child=left,fa=v;
4).然后进行push操作

对于pop操作:
1).根据中序遍历性质,可知接下来的节点必定是pop节点的右孩子(如果有的话),child=right,fa=s.top()
2).进行pop操作。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string.h>
#include <cmath>
#include <stack>
#define LEFT 0
#define RIGHT 1
using namespace std;

const int maxn=35;
stack<int> s;

struct Node{
    int left=-1;
    int right=-1;
}node[maxn];

bool first=true;
void postOrder(int u){
    if(u==-1)
        return;
    postOrder(node[u].left);
    postOrder(node[u].right);
    if(first){
        first=false;
        printf("%d",u);
    }
    else{
        printf(" %d",u);
    }
}
int main()
{
    int n,v;
    int root=-1,fa;
    int child=LEFT;
    char str[10];
    scanf("%d",&n);
    while(scanf("%s",str)!=EOF){
        //if(str[0]=='y')
        //    break;
        if(strcmp(str,"Push")==0){
            scanf("%d",&v);
            if(root==-1){
                root=v;
            }
            else{
                if(child==LEFT){
                    node[fa].left=v;
                }
                else{
                    node[fa].right=v;
                }
            }
            fa=v;
            child=LEFT;
            s.push(v);
        }
        else{
            child=RIGHT;
            fa=s.top();
            s.pop();
        }
    }
    postOrder(root);
    return 0;
}
View Code

 

posted @ 2017-02-11 11:34  辰曦~文若  阅读(1215)  评论(0编辑  收藏  举报