二叉树遍历

来源:互联网 发布:手游推荐 知乎 编辑:程序博客网 时间:2024/06/15 11:55

二叉树遍历

题目描述:

二叉树的前序、中序、后序遍历的定义:前序遍历:对任一子树,先访问跟,然后遍历其左子树,最后遍历其右子树;中序遍历:对任一子树,先遍历其左子树,然后访问根,最后遍历其右子树;后序遍历:对任一子树,先遍历其左子树,然后遍历其右子树,最后访问根。给定一棵二叉树的前序遍历和中序遍历,求其后序遍历(提示:给定前序遍历与中序遍历能够唯一确定后序遍历)。

输入:

两个字符串,其长度n均小于等于26。第一行为前序遍历,第二行为中序遍历。二叉树中的结点名称以大写字母表示:A,B,C....最多26个结点。

输出:

输入样例可能有多组,对于每组测试样例,输出一行,为后序遍历的字符串。

样例输入:

ABCBACFDXEAGXDEFAG

样例输出:

BCAXEDGAF

code

#include<iostream>#include<cstring>#include<cstdio>using namespace std;//定义树struct Node{    Node *lchild;    Node *rchild;    char c; //节点字符信息} Tree[50];int loc;//申请节点空间Node *creat(){    Tree[loc].lchild = Tree[loc].rchild = NULL;    return &Tree[loc++];}//前序、中序遍历结果字符串char str1[30], str2[30];//后序遍历void postOrder(Node *T){    if (T->lchild != NULL)        postOrder(T->lchild);    if (T->rchild != NULL)        postOrder(T->rchild);    cout << T->c;}//还原树Node* build(int s1, int e1, int s2, int e2){    Node* ret = creat();    ret->c = str1[s1];    int rootldx;    //查找根节点字符在中序遍历中的位置    for (int i = s2; i <= e2; i++)    {        if (str2[i]==str1[s1])        {            rootldx = i;            break;        }    }    //左子树不空    if (rootldx != s2)        ret->lchild = build(s1 + 1, s1 + (rootldx - s2), s2, rootldx - 1);    //右子树不空    if (rootldx != e2)        ret->rchild = build(s1 + (rootldx - s2) + 1, e1, rootldx + 1, e2);    return ret;}int main(){    while (scanf("%s", str1) != EOF)    {        scanf("%s", str2);        loc = 0;        int s1 = strlen(str1);        int s2 = strlen(str2);        //还原树        Node* T = build(0, s1 - 1, 0, s2 - 1);        postOrder(T);        cout << endl;    }}
0 0