求先序排列

/*

问题 K: 求先序排列
时间限制: 1 Sec 内存限制: 125 MB
提交: 24 解决: 8
[提交] [状态] [讨论版] [命题人:外部导入]
题目描述
给出一棵二叉树的中序与后序排列。求出它的先序排列。(约定树结点用不同的大写字母表示,长度<=16)。
输入
每个测试文件只包含一组测试数据,每组输入包含两行,第一行输入一个字符串表示二叉树的中序排列,第二行输入一个字符串表示二叉树的后序排列。
输出
对于每组输入数据,输出二叉树的先序排列。
样例输入 Copy
BADC
BDCA
样例输出 Copy
ABCD

*/

//求先序排列

#include <iostream>
using namespace std;
typedef struct BTreeNode{
    char Data; 
    struct BTreeNode *leftTree;
    struct BTreeNode *rightTree;           
}*BTree;
//以下是根据中序遍历和后序遍历建立树的过程 
/*中序,后序,根节点,中序起点,中序终点,后序起点,后序终点*/ 
void PostBTree(string mid, string after, BTree &root, int lm, int rm, int la, int ra){
    root = new BTreeNode();
    root->Data = after[ra];//把后序遍历的最后一个,也就是该树树根 
    root->leftTree = NULL;
    root->rightTree = NULL;
    int pos = lm;//将指针指向中序起点 
    while(after[ra] != mid[pos]){//后序终点不等于中序指针所指向的节点 
        pos++;//移动指针 
    }
    int len = pos - lm;//指针到中序起点的距离 
    if(pos > lm){//此处判断是否有左子树 (指针大于中序起点) 
        /*中序,后序,左子树,中序起点(左子树起点),左子树终点,后序起点,后序终点(对左子树来说)*/
        PostBTree(mid, after, root->leftTree, lm, pos - 1, la , la + len - 1 );
    }
    if(pos < rm){//此处判断是否有右子树 (指针小于中序终点)
        /*中序,后序,右子树,右子树起点(中序序列中),右子树终点,后序起点(伪起点),后序终点*/ 
        PostBTree(mid, after, root->rightTree, pos + 1, rm, la + len, ra - 1);
    }
}
//先序遍历 
PrintTree(BTree &t){
    if(t != NULL){
        cout << t->Data;
        PrintTree(t->leftTree);
        PrintTree(t->rightTree);
    }
}
int main(){
    BTree t;
    string s1, s2;
    cin >> s1 >> s2;
    PostBTree(s1, s2, t, 0, s1.size() - 1, 0, s2.size() - 1);
    PrintTree(t);
} 

 

posted @ 2019-03-05 09:53  kakaluotedj  阅读(161)  评论(0)    收藏  举报