题目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>
#include <iostream>
#include <algorithm>
#include <string.h>

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);
    printf("%c",T->c);
}

Node *build(int s1, int e1, int s2, int e2){
    Node* ret = creat();
    ret->c=str1[s1];
    int rootIdx=0;
    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);
    }
    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 = (int)strlen(str1);
        int l2 = (int)strlen(str2);
        Node* T = build(0,l1-1,0,l2-1);
        postOrder(T);
        printf("\n");
    }
    return 0;
}

/**************************************************************
    Problem: 1078
    User: zpfbuaa
    Language: C++
    Result: Accepted
    Time:0 ms
    Memory:1520 kb
****************************************************************/
时间: 2024-11-06 10:59:42

题目1078:二叉树遍历(由前序遍历中序遍历得到后序遍历)的相关文章

二叉树遍历 A1086.Tree Traversals Again(25) (转化为给定前序和中序列,求后序)

#include <bits/stdc++.h> #include <stdio.h> #include <stdlib.h> #include <queue> using namespace std; const int maxn = 50; struct node{ int data; node* lchild; node* rchild; }; int pre[maxn],in[maxn],post[maxn]; int n; node* create

二叉树遍历(前序、中序、后序、层次、深度优先、广度优先遍历)

二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的.对于二叉树,有深度遍历和广度遍历,深度遍历有前序.中序以及后序三种遍历方法,广度遍历即我们平常所说的层次遍历.因为树的定义本身就是递归定义,因此采用递归的方法去实现树的三种遍历不仅容易理解而且代码很简洁,而对于广度遍历来说,需要其他数据结构的支撑,比如堆了.所以,对于一段代码来说,可读性有时候要比代码本身的效率要重要的多. 四种主要的遍历思想为: 前序遍历:根结点 ---> 左子树 ---> 右子树 中序遍历:左子

二叉树基本操作:前序、中序、后序遍历(递归方式)

二叉树是最常见最重要的数据结构之一,它的定义如下: 二叉树(binary tree)是有限多个节点的集合,这个结合或者是空集,或者由一个根节点和两颗互不相交的.分别称为左子树和右子树的二叉树组成. 二叉树最基本的操作是遍历:一般约定遍历时左节点优先于右节点,这样根据根节点的遍历顺序可分为三种遍历操作:前序-先遍历根节点,再处理左右节点:中序-先遍历左节点,然后处理根节点,最后处理右节点:后序-先遍历左右节点,然后处理根节点. 从上边二叉树定义可以看出:二叉树使用了递归的概念描述.所以,二叉树的很

非递归实现二叉树的遍历(前序、中序、后序)

树的定义本是递归定义,所以采用递归的方法实现遍历算法,更加让人理解,且代码简单方便.若采用非递归的方法实现,须得利用栈模拟实现. 栈的特点(后进先出) 非递归实现二叉树的前序遍历: 原理如图所示: 参考代码如下: void _PrevOrder(Node* root)//非递归实现前序遍历 { stack<Node*> s; if(root == NULL) return; s.push(root); while (!s.empty()) { root = s.top(); cout<&

通过二叉树的中序序列和后序序列获取前序序列

二叉树的遍历方式常见的三种是:先序遍历(ABC).中序遍历(BAC).后序遍历(BCA) 先序遍历: 若二叉树为空,则空操作:否则: 访问根结点; 先序遍历左子树: 先序遍历右子树. 中序遍历: 若二叉树为空,则空操作:否则: 中序遍历左子树: 访问根结点: 中序遍历右子树. 后序遍历: 若二叉树为空,则空操作:否则: 后序遍历左子树: 后序遍历右子树: 访问根结点. 在学习到 根据遍历序列确定二叉树 时,知道了:可以通过二叉树的先中或者中后遍历序列唯一确定一棵二叉树. 根据算法描述 使用jav

算法进化历程之“根据二叉树的先序和中序序列输出后序序列”

巧若拙(欢迎转载,但请注明出处:http://blog.csdn.net/qiaoruozhuo) 前不久在看到一个作业"根据二叉树的先序和中序序列输出后序序列",当时我参考<数据结构与算法(C语言)习题集>上的做法,先根据先中序序列确定一颗二叉树,然后后序遍历二叉树输出后序序列. 函数采用了递归算法,利用函数传入的先序和中序序列的左右边界,确定要处理的序列段,生成相应的二叉树. 基本思路是,把该段先序序列的第一个元素作为当前二叉树的根结点,然后在中序序列找到根结点.根结点

先序序列和后序序列并不能唯一确定二叉树

数据结构的基础知识中重要的一点就是能否根据两种不同遍历序列的组合(有三种:先序+中序,先序+后序,中序+后序),唯一的确定一棵二叉树.然后就是根据二叉树的不同遍历序列(先序.中序.后序),重构二叉树.显然,这三种组合并不是都能唯一确定二叉树的,其中先序+后序就不能唯一确定一棵二叉树,其他两种组合可以唯一的确定一颗二叉树. 由先序序列和后序序列不能唯一确定一棵二叉树,因无法确定左右子树两部分. 反例:任何结点只有左子树的二叉树和任何结点只有右子树的二叉树,其前序序列相同,后序序列相同,但却是两棵不

中序表达式转后序表式式

中序表达式转后序表式式: 将中序表达式所有括号补全,然后将所有运算符向右移出无匹配的第一个右括号,去掉括号即为后序表式式 举例: 原式:a+b*(c+d/e) 补全括号:(a+(b*(c+(d/e)))) 操作符右移:(a(b(c(de)/)+)*)+ 去掉括号:abcde/+*+ 中序表达式转前序表式式: 将中序表达式所有括号补全,然后将所有运算符向左移出无匹配的第一个左括号,去掉括号即为前序表式式 举例: 原式:a+b*(c+d/e) 补全括号:(a+(b*(c+(d/e)))) 操作符右移

二叉树 层序、前序、中序、后序遍历。

简单二叉树     public  class Node<T>     {         private T _data;         private Node<T> _leftChild;         private Node<T> _rightChild;         private Node<T> _Parent;         private int flag;         public  Node(){}         pub

二叉树的三种遍历(前序,中序,后序)

参考<大话数据结构>P178~184——二叉树的遍历. 用书上的这个二叉树: 代码和解释如下(VS2012测试通过): 1 #include <iostream> 2 using namespace std; 3 4 //二叉树的二叉链表结点结构定义 5 typedef struct BiTNode 6 { 7 char data; 8 struct BiTNode *lchild,*rchild; 9 }BiTNode; 10 11 //输入前序遍历,创建二叉树 12 //这里输