题目1078:二叉树遍历

时间限制:1 秒

内存限制:32 兆

题目描述:

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

输入:

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

输出:

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

样例输入:
ABC
BAC
FDXEAG
XDEFAG
样例输出:
BCA
XEDGAF
#include <iostream>
#include<string.h>
using namespace std;
struct Node//树结点结构体
{
    Node *lchild;//左子树
    Node *rchild;//右子树
    char c;//节点字符信息
} Tree[50];//静态内存分配数组
int loc;//静态数组中已经分配的结点个数
Node *create()//申请一个结点空间,返回其指向其的指针
{
    Tree[loc].lchild=Tree[loc].rchild=NULL;//初始化左右儿子为空
    return &Tree[loc++];//返回指针,且loc累加
}
char str1[30],str2[30];//保存前序和中序遍历结果字符串
void postOrder(Node *T)//后序遍历
{
    if(T->lchild!=NULL)//左子树不为空,遍历左子树
    {
        postOrder(T->lchild);
    }
    if(T->rchild!=NULL)//右子树不为空,遍历右子树
    {
        postOrder(T->rchild);
    }
    printf("%c",T->c);//遍历该节点,输出其字符信息
}
/*
//由前序和中序还原树,并返回其根节点,前序遍历结果为str1[s1]-str1[e1],中序遍历结果为str2[s2]=str2[e2];
*/
Node *build(int s1,int e1,int s2,int e2)
{
    Node *ret=create();//为树根结点申请空间
    ret->c=str1[s1];//该结点字符为前序遍历的第一个字符
    int rootIdx;
    for(int i=s2; i<=e2; i++) //查找根节点字符在中序遍历中的位置
    {
        if(str2[i]==str1[s1])
        {
            rootIdx=i;
            break;
        }
    }
    if(rootIdx!=s2)//若左子树不为空
    {
        ret->lchild=build(s1+1,s1+(rootIdx-s2),s2,rootIdx-1);//(rootIdx-s2)为左子树的长度
        //递归还原左子树
    }
    if(rootIdx!=e2)//右子树不为空
    {
        ret->rchild=build(s1+(rootIdx-s2)+1,e1,rootIdx+1,e2);
        //递归还原右子树
    }
    return ret;//返回根节点指针
}

int main()
{
    while(scanf("%s",str1)!=EOF)
    {
        scanf("%s",str2);
        loc=0;
        int L1=strlen(str1);
        int L2=strlen(str2);
        Node *T=build(0,L1-1,0,L2-1);
        postOrder(T);
        printf("\n");
    }
    return 0;
}

时间: 2024-10-14 10:44:32

题目1078:二叉树遍历的相关文章

九度OJ 1078 二叉树遍历

题目1078:二叉树遍历 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2649 解决:1599 题目描述: 二叉树的前序.中序.后序遍历的定义: 前序遍历:对任一子树,先访问跟,然后遍历其左子树,最后遍历其右子树: 中序遍历:对任一子树,先遍历其左子树,然后访问根,最后遍历其右子树: 后序遍历:对任一子树,先遍历其左子树,然后遍历其右子树,最后访问根. 给定一棵二叉树的前序遍历和中序遍历,求其后序遍历(提示:给定前序遍历与中序遍历能够唯一确定后序遍历). 输入: 两个字符串,其长度

九度oj 题目1184 二叉树遍历

原题链接:http://ac.jobdu.com/problem.php?pid=1184 简单的二叉树重建,遍历. 如下: 1 #include<cstdio> 2 #include<cstdlib> 3 #include<cstring> 4 #include<vector> 5 struct node{ 6 char key; 7 node *ch[2]; 8 node(char d) : key(d) { ch[0] = ch[1] = NULL;

题目1078:二叉树遍历(由前序遍历中序遍历得到后序遍历)

题目链接:http://ac.jobdu.com/problem.php?pid=1078 题目详解:https://github.com/zpfbuaa/JobduInCPlusPlus // // 1078 二叉树遍历.cpp // Jobdu // // Created by PengFei_Zheng on 09/04/2017. // Copyright © 2017 PengFei_Zheng. All rights reserved. // #include <stdio.h>

九度oj 题目1078:二叉树遍历

题目1078:二叉树遍历 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:5326 解决:3174 题目描述: 二叉树的前序.中序.后序遍历的定义: 前序遍历:对任一子树,先访问跟,然后遍历其左子树,最后遍历其右子树: 中序遍历:对任一子树,先遍历其左子树,然后访问根,最后遍历其右子树: 后序遍历:对任一子树,先遍历其左子树,然后遍历其右子树,最后访问根. 给定一棵二叉树的前序遍历和中序遍历,求其后序遍历(提示:给定前序遍历与中序遍历能够唯一确定后序遍历). 输入: 两个字符串,其长度

D - 二叉树遍历(推荐)

二叉树遍历问题 Description Tree Recovery Little Valentine liked playing with binary trees very much. Her favorite game was constructing randomly looking binary trees with capital letters in the nodes. This is an example of one of her creations: D / / B E /

华科机考:二叉树遍历

时间限制:1秒                    空间限制:32768K 题目描述 二叉树的前序.中序.后序遍历的定义: 前序遍历:对任一子树,先访问跟,然后遍历其左子树,最后遍历其右子树:中序遍历:对任一子树,先遍历其左子树,然后访问根,最后遍历其右子树: 后序遍历:对任一子树,先遍历其左子树,然后遍历其右子树,最后访问根. 给定一棵二叉树的前序遍历和中序遍历,求其后序遍历(提示:给定前序遍历与中序遍历能够唯一确定后序遍历). 输入描述: 两个字符串,其长度n均小于等于26. 第一行为前序

【编程题目】二叉树两个结点的最低共同父结点

75.二叉树两个结点的最低共同父结点(树)题目:二叉树的结点定义如下:struct TreeNode{int m_nvalue;TreeNode* m_pLeft;TreeNode* m_pRight;};输入二叉树中的两个结点,输出这两个结点在数中最低的共同父结点. 思路:修改后序遍历 我的方法需要一个额外的整数n来标定. 开始想用非递归,结果写不出来... 只好用递归了.... /* 75.二叉树两个结点的最低共同父结点(树) 题目:二叉树的结点定义如下: struct TreeNode {

每天刷个算法题20160518:非递归二叉树遍历

版权所有.所有权利保留. 欢迎转载,转载时请注明出处: http://blog.csdn.net/xiaofei_it/article/details/51502254 为了防止思维僵化,每天刷个算法题.已经刷了几天了,现在贴点代码. 2002年我初中二年级,开始学习BASIC语言.2004年中考之后,开始参加NOIP,系统学习算法.一直非常喜欢算法,但工作后几乎不再碰这些东西.现在准备重新捡起来. 我已经建了一个开源项目,每天的题目都在里面: https://github.com/Xiaofe

1910:二叉树遍历

时间限制:1 秒 内存限制:32 兆 特殊判题: 否 提交:31 解决: 19 标签 二叉树遍历 题目描述 二叉树的前序.中序.后序遍历的定义:前序遍历:对任一子树,先访问跟,然后遍历其左子树,最后遍历其右子树:中序遍历:对任一子树,先遍历其左子树,然后访问根,最后遍历其右子树:后序遍历:对任一子树,先遍历其左子树,然后遍历其右子树,最后访问根.给定一棵二叉树的前序遍历和中序遍历,求其后序遍历(提示:给定前序遍历与中序遍历能够唯一确定后序遍历). 输入格式 两个字符串,其长度n均小于等于26.第

二叉树——遍历篇(c++)

二叉树--遍历篇 二叉树很多算法题都与其遍历相关,笔者经过大量学习并进行了思考和总结,写下这篇二叉树的遍历篇. 1.二叉树数据结构及访问函数 #include <stdio.h> #include <iostream> #include <stack> using namespace std; struct BTNode { int value; struct BTNode *left, *right; BTNode(int value_) :value(value_)