传送门

Description

A binary tree is a finite set of vertices that is either empty or consists of a root r and two disjoint binary trees called the left and right subtrees. There are three most important ways in which the vertices of a binary tree can be systematically traversed or ordered. They are preorder, inorder and postorder. Let T be a binary tree with root r and subtrees T1,T2.

In a preorder traversal of the vertices of T, we visit the root r followed by visiting the vertices of T1 in preorder, then the vertices of T2 in preorder.

In an inorder traversal of the vertices of T, we visit the vertices of T1 in inorder, then the root r, followed by the vertices of T2 in inorder.

In a postorder traversal of the vertices of T, we visit the vertices of T1 in postorder, then the vertices of T2 in postorder and finally we visit r.

Now you are given the preorder sequence and inorder sequence of a certain binary tree. Try to find out its postorder sequence.

Input

The input contains several test cases. The first line of each test case contains a single integer n (1<=n<=1000), the number of vertices of the binary tree. Followed by two lines, respectively indicating the preorder sequence and inorder sequence. You can assume they are always correspond to a exclusive binary tree.

Output

For each test case print a single line specifying the corresponding postorder sequence.

Sample Input

9 1 2 4 7 3 5 8 9 6 4 7 2 1 8 5 9 3 6

Sample Output

7 4 2 8 9 5 6 3 1

思路

题意:已知前序遍历和中序遍历,求后序遍历。

#include<bits/stdc++.h>
using namespace std;
const int maxn = 10005;

void post(int n,int a[],int b[],int c[])
{
    if (n <= 0)    return;
    int pos;
    for (int i = 0;i < n;i++)
        if (b[i] == a[0])    pos = i;
    post(pos,a + 1,b,c);
    post(n - pos - 1,a + pos + 1,b + pos + 1,c + pos);
    c[n - 1] = a[0];
}

int main()
{
    int N;
    while (~scanf("%d",&N))
    {
        int a[maxn],b[maxn],c[maxn];
        for (int i = 0;i < N;i++)    scanf("%d",&a[i]);
        for (int i = 0;i < N;i++)    scanf("%d",&b[i]);
        post(N,a,b,c);
        printf("%d",c[0]);
        for (int i = 1;i < N;i++)    printf(" %d",c[i]);
        printf("\n");
    }
    return 0;
}
 
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1005;
typedef struct Tree{
	Tree *left,*right;
	int val;
}Tree;
Tree *head;
Tree *build(int a[],int b[],int N)
{
	Tree *node;
	for (int i = 0;i < N;i++)
	{
		if (b[i] == a[0])
		{
			node = (Tree *)malloc(sizeof(Tree));
			node->val = a[0];
			node->left = build(a + 1,b,i);
			node->right = build(a + i + 1,b + i + 1, N - i - 1);
			return node;
		}
	}
	return NULL;
}

void Print(Tree *p)
{
	if (p == NULL)	return;
	Print(p->left);
	Print(p->right);
	if (p == head)	printf("%d\n",p->val);
	else	printf("%d ",p->val);
	free(p);
}

int main()
{
	int N,a[maxn],b[maxn];
	while (~scanf("%d",&N))
	{
		for (int i = 0;i < N;i++)	scanf("%d",&a[i]);
		for (int i = 0;i < N;i++)	scanf("%d",&b[i]);
		head = build(a,b,N);
		Print(head);
	}
	return 0;
}

  

HDU 1710 Binary Tree Traversals(二叉树遍历)的更多相关文章

  1. hdu 1710 Binary Tree Traversals 前序遍历和中序推后序

    题链;http://acm.hdu.edu.cn/showproblem.php?pid=1710 Binary Tree Traversals Time Limit: 1000/1000 MS (J ...

  2. HDU 1710 Binary Tree Traversals(二叉树)

    题目地址:HDU 1710 已知二叉树先序和中序求后序. #include <stdio.h> #include <string.h> int a[1001], cnt; ty ...

  3. HDU 1710 Binary Tree Traversals (二叉树遍历)

    Binary Tree Traversals Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/O ...

  4. hdu1710(Binary Tree Traversals)(二叉树遍历)

    Binary Tree Traversals Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/O ...

  5. HDU 1710 Binary Tree Traversals(树的建立,前序中序后序)

    Binary Tree Traversals Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/O ...

  6. 【二叉树】hdu 1710 Binary Tree Traversals

    acm.hdu.edu.cn/showproblem.php?pid=1710 [题意] 给定一棵二叉树的前序遍历和中序遍历,输出后序遍历 [思路] 根据前序遍历和中序遍历递归建树,再后续遍历输出 m ...

  7. HDU 1710 Binary Tree Traversals

    题意:给出一颗二叉树的前序遍历和中序遍历,输出其后续遍历 首先知道中序遍历是左子树根右子树递归遍历的,所以只要找到根节点,就能够拆分出左右子树 前序遍历是按照根左子树右子树递归遍历的,那么可以找出这颗 ...

  8. hdu 1701 (Binary Tree Traversals)(二叉树前序中序推后序)

                                                                                Binary Tree Traversals T ...

  9. hdu1710 Binary Tree Traversals(二叉树的遍历)

    A binary tree is a finite set of vertices that is either empty or consists of a root r and two disjo ...

随机推荐

  1. K-means算法和矢量量化

    语音信号的数字处理课程作业——矢量量化.这里采用了K-means算法,即假设量化种类是已知的,当然也可以采用LBG算法等,不过K-means比较简单.矢量是二维的,可以在平面上清楚的表示出来. 1. ...

  2. ASP.NET的编译原理

    http://www.cnblogs.com/mdy2001212/archive/2008/01/31/1060345.html

  3. 什么是web框架?

    英文原文:http://jeffknupp.com/blog/2014/03/03/what-is-a-web-framework/ 在原文基础上加上了自己在翻译过程中,查看的资料和自己的一些理解,同 ...

  4. JAVA反射其实就是那么一回事

    概念:什么是反射 java反射机制: JAVA反射机制是在运行状态中, 对于任意一个类,都能够知道这个类的所有属性和方法: 对于任意一个对象,都能够调用它的任意一个方法和属性: 这种动态获取的信息以及 ...

  5. [转]Android Studio创建Xposed模块项目时BridgeApi的正确添加方式

    使用Android Studio创建的空项目作为Xposed Module App,对于Api Jar包的引用方式,一开始是按照傻瓜式Jar Lib的处理方式,复制XposedBridgeApi-54 ...

  6. 学习SQLite之路(二)

    下面就是真正关于数据库的一些知识了: 20160614更新 参考: http://www.runoob.com/sqlite/sqlite-tutorial.html 1. SQLite创建表: 基本 ...

  7. AngularJS引入Echarts的Demo

    最近要用到图表展示,想了想,还是首选Echarts,HighCharts和D3.js备用吧, 而项目中也用到了AngularJS,所以需要把Echarts引入到AngularJs中一起使用, 试了试, ...

  8. Webmin|Linux管理员远程管理工具

    介绍: Webmin is a web-based interface for system administration for Unix. Using any modern web browser ...

  9. 【Spring】构建Springboot项目 实现restful风格接口

    项目代码如下: package hello; import org.springframework.boot.SpringApplication; import org.springframework ...

  10. iOS -- 隐藏返回按钮

    // 隐藏返回按钮 [self.navigationItem setHidesBackButton:YES];