PAT 1020. Tree Traversals

#include<iostream>
#include<cstring>
#include<queue>
using namespace std;

//已知二叉树的后序和中序遍历,得到层次遍历顺序。
const int N = 30;

struct Node
{
    Node* left;
    Node* right;
    int data;
};
int postOrder[N];
int inOrder[N];

//b1,e1表示后序的开始和结束位置;b2,e2表示中序的开始和结束位置。
void createTree(int b1,int e1,int b2,int e2,Node* &curNode)
{
    if(b1<0 || b2<0 || b1>e1 || b2>e2) 
        return;
    if(NULL == curNode)
        curNode = new Node();
    curNode->left = NULL;
    curNode->right = NULL;
    curNode->data = postOrder[e1];
    int i = 0,j=0;
    //由于相对位置不一致,所以需要有两个游标。
    for(i=e2,j=e1; i>=b2; i--,j--)
        if(inOrder[i] == postOrder[e1])//postOrder[e]为当前子树的根节点。
            break;
    createTree(b1,j-1,b2,i-1,curNode->left);
    createTree(j,e1-1,i+1,e2,curNode->right);
}

//层次遍历二叉树.
void levelOrder(Node* root)
{
    if(NULL == root)
        return;
    queue<Node*> Q;
    Q.push(root);
    bool isFirst = true;
    while( !Q.empty() )
    {
        Node *tmp = Q.front();
        Q.pop();
        if(NULL == tmp)
            return;
        if(isFirst) 
        {
            cout<<tmp->data;
            isFirst = false;
        }
        else
            cout<<" "<<tmp->data;
        //左右子树入队列
        if(tmp->left)
            Q.push(tmp->left);
        if(tmp->right)
            Q.push(tmp->right);
    }
    cout<<endl;
}

int main()
{
    int n,i;
    cin>>n;
    for(i=0; i<n; i++)
        cin>>postOrder[i];
    for(i=0; i<n; i++)
        cin>>inOrder[i];
    Node *root = NULL;
    createTree(0,n-1,0,n-1,root);
    levelOrder(root);
    return 0;
}
posted @ 2012-12-01 14:45  Frank@609  Views(347)  Comments(0Edit  收藏  举报