03-树3. Tree Traversals Again (25)

03-树3. Tree Traversals Again (25)_第1张图片

问题描述:
输入显示的是中序遍历非递归,栈的操作,输出树的后序遍历
问题关键
push的顺序为先序遍历,pop的顺序为中序遍历
问题转换为由先序遍历、中序遍历求后续遍历

/*=============================================================================
#       COPYRIGHT NOTICE
#       Copyright (c) 2015

#
#       @Author       :TonyChou
#       @Email         :[email protected]
#       @Filename         :/home/zhoudaxia/program/PAT_MOOC_DS\03_3.cc
#       @Last modified         :2015-06-30 21:22
#       @Description    :
=============================================================================*/
#include
#include
#include
#include
#include

using namespace std;

int find_head(vector<int> &v, int data){
    for(int i = 0; i!= v.size(); ++i)
        if(v[i]==data)
            return i;
}
void find_post(vector<int> &v1, vector<int> &v2,int left2, int right2, int head1){
    int head2 = find_head(v2, v1[head1]);
    int left_size = head2 - left2;
    if(head1!=v1.size()){
    if(head2>left2)
        find_post(v1,v2,left2, head2-1, head1+1);
    if(head21,right2,head1+left_size+1);
    if(head1==0)
        cout << v1[head1];
    else
        cout << v1[head1] <<" ";
    }
}
int main(){
    int N;
    string s;
    int node;
    vector<int> pre_v;
    vector<int> in_v;
    stack<int> sta;
    cin >> N;
    for(int i=0;i != 2*N; ++i){
        cin >> s;
        if(s=="Push"){
            cin>>node;
            pre_v.push_back(node);
            sta.push(node);         
        }
        else{
            in_v.push_back(sta.top());
            sta.pop();
        }
    }
    find_post(pre_v,in_v,0,pre_v.size()-1,0);
    return 0;
}   

解析
先序遍历在v1中
1 2 3 4 5 6
后序遍历
3 2 4 1 6 5

递归中的参数【left2 right2】为左子树的在v2的范围,head1为头结点在v1的位置
head2为头结点在v2的位置
递归的出口是head1遍历到v1尾部,
当head2!=left2时递归[left2,head2-1]
head2 != right2时递归[head2+1,right2]
否则输出v1[head1]

你可能感兴趣的:(PAT-MOOC-DS)