给定二叉树的先序遍历和中序遍历,输出它的后序遍历序列

这里没再用到先申请大Node数组的方法了,想练练写动态内存分配和释放的,一次OK了,也没怎么出错啊,开心~

方法二 - Code:

//给出一个二叉树的先序遍历和中序遍历,输出它的后序遍历
//直接构造的方法白书已给出。这里是先递归构造二叉树,然后进行后序遍历。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAXN 1000

typedef struct node
{
 char data;
 struct node *left,*right;
}Node;

void postorder(Node *root);
Node* build(int n,char *s1,char *s2);
Node* newNode();
void remove_tree(Node* root);

char s1[MAXN],s2[MAXN];

int main()
{
 while(scanf("%s%s",s1,s2)==2)
 {
  int n=strlen(s1);
  Node *root=build(n,s1,s2);
  postorder(root);
  printf("\n");
  remove_tree(root);
 }
} 

void postorder(Node *root)
{
 if(root==NULL) return;
 postorder(root->left);
 postorder(root->right);
 printf("%c",root->data);
}

Node* build(int n,char *s1,char *s2)
{
 if(n<=0) return NULL;
 Node *r=newNode();
 r->data=s1[0];
 int p=strchr(s2,s1[0])-s2;
 r->left=build(p,s1+1,s2);
 r->right=build(n-1-p,s1+1+p,s2+p+1);
 return r;
}

Node* newNode()
{
 Node* u=(Node*)malloc(sizeof(Node));
 if(u!=NULL)
 {
  u->data=0;
  u->left=u->right=NULL;
 }
 return u;
}

void remove_tree(Node* root)
{
 if(root!=NULL)
 {
  remove_tree(root->left);
  remove_tree(root->right);
  free(root);
 }
}

方法一 - Code:

#include<stdio.h>
#include<string.h>
#define MAXN 256

void build(int n,char *s1,char *s2,char *s);

int main()
{
 char s1[MAXN],s2[MAXN],ans[MAXN];
 while(scanf("%s%s",s1,s2)==2)
 {
  int n=strlen(s1);
  build(n,s1,s2,ans);
  ans[n]='\0';
  printf("%s\n",ans);
 }
 return 0;
}

void build(int n,char *s1,char *s2,char *s)
{
 if(n<=0) return;
 int p=strchr(s2,s1[0])-s2;
 build(p,s1+1,s2,s);
 build(n-p-1,s1+p+1,s2+p+1,s+p);
 s[n-1]=s1[0];
}

时间: 2024-07-30 00:41:47

给定二叉树的先序遍历和中序遍历,输出它的后序遍历序列的相关文章

[无需建树]已知前序或后序和中序遍历结果,输出前序或后序或层次遍历的方法汇总

最近刷PAT老是碰到这种憨批题目,这种题目在算法面试中也是常客了,主要分为4类 已知前序 中序,求后序 已知前序 中序,求层次 已知后序 中序,求前序 已知前序 中序,求层次 而这四种题目如果要做出来的话,通通不需要建树,因为建树也是按照一定的递归顺序来的,就算是层次遍历,也可以在递归途中保存一些信息来获得. 我们先给出一颗二叉树 可以得到以下信息 前序:4,1,3,2,6,5,7 中序:1,2,3,4,5,6,7 后序:2,3,1,5,7,6,4 层次:4,1,6,3,5,7,2 前序&中序-

二叉树详解及二叉树的前序、中序、后序遍历(递归和非递归)

介绍二叉树之前先介绍一下树相关的概念. 树的定义:树是n(n>=0)个有限个数据的元素集合,形状像一颗倒过来的树. 树的概念: 节点:结点包含数据和指向其它节点的指针. 根节点:树第一个结点称为根节点. 结点的度:结点拥有的子节点个数. 叶节点:没有子节点的节点(度为0). 父子节点:一个节点father指向另一个节点child,则child为孩子节点,father为父亲节点 兄弟节点:具有相同父节点的节点互为兄弟节点. 节点的祖先:从根节点开始到该节点所经的所有节点都可以称为该节点的祖先. 子

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

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

二叉树的前序中序后序遍历相互求法

二叉树的前中后序遍历,他们的递归非递归.还有广度遍历,参见二叉树的前中后序遍历迭代&广度遍历和二叉树的前中后序遍历简单的递归 现在记录已知二叉树的前序中序后序遍历的两个,求另外一个.一般,这两个中一定有中序遍历. 1.已知前序和中序,求后序遍历: 前序:ABDECFG  中序:DBEAFCG 思路简单:前序的第一个节点就是根节点, 中序中找到根节点的位置,根节点之前是其左子树,之后是右子树   按此顺序,依次在左子树部分遍历,右子树部分遍历 C++ 代码: TreeNode *BinaryTre

二叉树的先序、中序、后序遍历等基本操作c++实现

二叉树:树的每个节点最多有两个子节点. 1.实现二叉链表的结构: //节点结构 template<class T> struct  BinaryTreeNode { BinaryTreeNode<T>* _left;//左子树 BinaryTreeNode<T>* _right;//右子树 T _data;//数据域 //构造函数 BinaryTreeNode(const T& x) :_left(NULL)//左孩子指针 ,_right(NULL)//右孩子指

南阳OJ-756 重建二叉树(二叉树的中序遍历和后序遍历求先序遍历)

重建二叉树 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 题目很简单,给你一棵二叉树的后序和中序序列,求出它的前序序列(So easy!). 输入 输入有多组数据(少于100组),以文件结尾结束.每组数据仅一行,包括两个字符串,中间用空格隔开,分别表示二叉树的后序和中序序列(字符串长度小于26,输入数据保证合法). 输出 每组输出数据单独占一行,输出对应得先序序列. 样例输入 ACBFGED ABCDEFG CDAB CBAD 样例输出 DBACEGF BCAD二

027依据前序遍历和中序遍历,重建二叉树(keep it up)

剑指offer中题目:http://ac.jobdu.com/problem.php?pid=1385 题目描写叙述: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.如果输入的前序遍历和中序遍历的结果中都不含反复的数字. 比如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并输出它的后序遍历序列. 输入: 输入可能包括多个測试例子,对于每一个測试案例, 输入的第一行为一个整数n(1<=n<=1000):代表二叉树的节点

二叉树基础(创建方法,遍历方法(前序/中序/后序/层序、递归/非递归)

二叉树的创建及遍历是很多二叉树问题的基础,递归遍历逻辑清晰,代码简约漂亮,然则效率低下(所有递归方案的通病,非不得已不用递归): 非递归遍历高效,却不是能信手写出来的,特别是后续非递归遍历,相信很多资深码工也有这样的经历: 5年前学习了二叉树的非递归遍历,一个月前复习了并达到能熟练写出的程度,在不参考任何资料的情况下,今天却怎样也写不出来. 如果你也有过这种经历,恭喜你,这说明你是一个正常人…… 另一方面市面上有些国人写的教材,各种语法.逻辑错误层出不起,不知祸害了多少未来的码工,深感痛心. 印

二叉树遍历算法——包含递归前、中、后序和层次,非递归前、中、后序和层次遍历共八种

首先,要感谢网上的参考资料. http://mengliao.blog.51cto.com/876134/1178079(作者:BlackAlpha) http://blog.csdn.net/fzh1900/article/details/14056735(作者:_云淡风轻) http://blog.csdn.net/stpeace/article/details/8138458(作者:stpeace) 二叉树是使用的比较广泛的一种数据结构,这里我写了二叉树的相关操作,包括初始化.新建.以及遍