American Heritage

题目描述

Farmer John takes the heritage of his cows very seriously. He is not, however, a truly fine bookkeeper. He keeps his cow genealogies as binary trees and, instead of writing them in graphic form, he records them in the more linear tree in-order" and tree pre-order" notations.

Your job is to create the `tree post-order" notation of a cow"s heritage after being given the in-order and pre-order notations. Each cow name is encoded as a unique letter. (You may already know that you can frequently reconstruct a tree from any two of the ordered traversals.) Obviously, the trees will have no more than 26 nodes.

Here is a graphical representation of the tree used in the sample input and output:

              C
            /   
           /     
          B       G
         /      /
        A   D   H
           / 
          E   F

The in-order traversal of this tree prints the left sub-tree, the root, and the right sub-tree.

The pre-order traversal of this tree prints the root, the left sub-tree, and the right sub-tree.

The post-order traversal of this tree print the left sub-tree, the right sub-tree, and the root.

----------------------------------------------------------------------------------------------------------------------------

题目大意:

给出一棵二叉树的前序遍历 (preorder) 和中序遍历 (inorder),求它的后序遍历 (postorder)。

你需要知道的:

1:二叉树的 相关定义可以在书上或者网上找到。

2:样例 输入输出反映的二叉树在上面。

输入描述

Line 1:

The in-order representation of a tree.

Line 2:

The pre-order representation of that same tree.

输出描述

A single line with the post-order representation of the tree.

样例输入

ABEDFCHG

CBADEFGH

样例输出

AEFDBHGC

#include<iostream>
#include<string>
using namespace std;
char postorder[10001];
string inorder,preorder;
int count=0;
void dfs(int index,int left,int right)//index为根节点在preorder中的位置,left,right为树的范围 
{
    if(left>right)
    {
    //postorder[count++]=preorder[index];
    return ;}
    for(int i=0;i<inorder.size();i++)
    if(inorder[i]==preorder[index])
    {
        dfs(index+1,left,i-1);
        dfs(index+i-left+1,i+1,right);
        postorder[count++]=inorder[i];
        break;
    }
}
int main()
{
    while(cin>>inorder>>preorder)
    {
        count=0;
    dfs(0,0,inorder.size()-1);
    for(int i=0;i<count;i++)
    cout<<postorder[i];
    cout<<endl;
    }
    return 0;
posted @ 2022-05-12 10:39  辛夸高岭桂  阅读(67)  评论(0)    收藏  举报