HDU 1710 二叉树遍历,输入前、中序求后序

1、HDU  1710  Binary Tree Traversals

2、链接:http://acm.hust.edu.cn/vjudge/problem/33792

3、总结:记录下根结点,再拆分左右子树,一直搜下去。感觉像dfs。

题意:二叉树,输入前、中序求后序。

(1)建立出一颗二叉树,更直观。但那些指针用法并不是很懂。

#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;

typedef struct tree
{
    tree *l,*r;
    int num;
};
tree *root;

tree *build(int *a,int *b,int n)
{
    tree *s;
    for(int i=0;i<n;i++)
    {
        if(a[0]==b[i]){
            s=(tree *)malloc(sizeof(tree));    //不要漏了这个

            s->num=b[i];
            s->l=build(a+1,b,i);
            s->r=build(a+i+1,b+i+1,n-i-1);
            return s;
        }
    }

    return NULL;
}

void postorder(tree *ro)
{
    if(ro==NULL)return ;
    postorder(ro->l);
    postorder(ro->r);
    if(ro==root){
        printf("%d\n",ro->num);
    }
    else {
        printf("%d ",ro->num);
    }
}

int main()
{
    int n;
    int a[1100],b[1100];
    while(scanf("%d",&n)!=EOF)
    {
        for(int i=0;i<n;i++)
            scanf("%d",&a[i]);
        for(int i=0;i<n;i++)
            scanf("%d",&b[i]);

        root=build(a,b,n);
        postorder(root);
    }

    return 0;
}

(2)直接在遍历时输出。

#include<iostream>
#include<cstdio>
using namespace std;

void preorder(int *a,int *b,int n,int flag)
{
    for(int i=0;i<n;i++)
    {
        if(a[0]==b[i]){
            preorder(a+1,b,i,0);
            preorder(a+i+1,b+i+1,n-i-1,0);
            if(flag){
                printf("%d\n",a[0]);
            }
            else {
                printf("%d ",a[0]);
            }
        }
    }
    return ;
}

int main()
{
    int n,a[1100],b[1100];
    while(scanf("%d",&n)!=EOF)
    {
        for(int i=0;i<n;i++)
            scanf("%d",&a[i]);
        for(int i=0;i<n;i++)
            scanf("%d",&b[i]);

        preorder(a,b,n,1);
    }

    return 0;
}

时间: 2024-10-14 16:25:25

HDU 1710 二叉树遍历,输入前、中序求后序的相关文章

HDU 1710 二叉树遍历

首先.先序遍历是先访问根节点.然后左节点 然后右节点.从根节点开始 直到它的子节点没有左节点才开始回溯访问上一个节点的右节点.同理.中序遍历 先访问左节点 然后是父节点 然后是右节点.从根节点开始 直到它的孩子节点没有左节点 才开始回溯访问该节点 然后是它的父节点 然后是它的兄弟右节点.也就是说 每次访问一个节点时 它的左节点已经被访问过了.访问过之后 就要访问它的 右节点.(有点醉T_T.......)后续遍历.从根节点开始 直到叶子节点.先访问左节点 然后是右节点.然后回溯访问父节点.注意回

PAT A1086 Tree Traversals Again [二叉树前序中序求后序]

题目描述 链接 用栈的形式给出一棵二叉树的建立的顺序,求这棵二叉树的后序遍历 分析 性质:树的先序等于入栈次序,树的中序遍历等于出栈次序 先序:先访问根再入栈,所以入栈次序就是先序遍历次序 中序:先递归访问左子树,回溯时访问根,回溯时即出栈时,所以出栈次序就是中序遍历 所以问题转换为已知先序中序,求后序 已知先序中序求后序的方法 \(root\) 保存先序中根的位置,\(st\),\(ed\) 为中序子树的起始结束位置 遍历中序,找到中序根的位置\(i\),从而分成左右子树 左子树在先序中根的位

关于二叉树的问题1-已知前序,中序求后序遍历

对于一棵二叉树而言,可以由其前序和中序或者中序和后序的遍历序列,确定一棵二叉树. 那么对于已知前序和中序序列,求后序序列也就是先还原二叉树,然后对其进行后序遍历即可. 二叉树结点的结构定义如下: struct TreeNode { char value; TreeNode *leftChild; TreeNode *rightChild; }; 实现代码如下: #include <stdio.h> #include <string.h> #include <stdlib.h&

UVa 二叉树重建(先序+中序求后序)

题意是给出先序和中序,求出后序. 先序遍历先访问根结点,通过根结点可以在中序中把序列分为左子树部分和右子树部分,我建了一个栈,因为后序遍历最后访问根结点,所以把每次访问的根结点放入栈中.因为后序遍历先是左子树然后是右子树,所以在递归的时候就先递归右子树,然后继续递归左子树. 写完程序后有个错误,找了很久才发现,就是我原本在计算左子树个数的时候,是这样计算的,pre2=mid-pre,但是当pre>mid时,就不对了.而正确计算左子树的方法应该是下面这样的. 1 #include<iostrea

已知前序中序求后序-二叉树

writer:pprp 思路很容易理解,但是实现还是有一点难度,容易错 参考书目:<算法竞赛宝典> 代码如下: //已知前序中序,求后序 #include <iostream> using namespace std; //a是前序,b是中序 void hwg(string a,string b) { int ll,lr; for(unsigned int i = 0; i < b.length(); i++) { if(a[0] == b[i]) //找到根节点 { ll

NOJ 2015年陕西省程序设计竞赛网络预赛(正式赛)(小女警的异世界之战-前序中序求后序)

A - 小女警的异世界之战 Time Limit: 1000 ms        Memory Limit: 65536 KB Submit Description 这一天,小女警花花,泡泡和毛毛来到终极Boss"Him"所在的异世界并准备与其决一死战,却被困在了他的城堡里.她们发现异世界是一个巨大的城堡.城堡由一个个大小不同的房间组成,房间有着以下的规则: 每个房间有且仅有一扇黄门,此外至多有一扇红门和一扇绿门:黄色代表通向更大的房间,绿色和红色代表通向更小的房间.很显然,如果你打开

UVA 536 Tree Recovery(由前序中序求后序,经典)

Tree Recovery Time Limit: 3000 MS 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 /

杭电1710 (已知二叉树前中序 求后序)

#include "iostream" #include "stack" using namespace std; int result[1001]; int cnt; /* 得到后序序列 */ void getPost(int* pre,int* in,int len) { /* 分别记录当前处理二叉树的前序 后序 和 长度*/ if (len == 0) /* 前序序列长度为0 直接返回*/ return; result[cnt++] = pre[0]; /*

HLG2040二叉树遍历已知前中,求后

二叉树的遍历 Time Limit: 1000 MS Memory Limit: 32768 K Total Submit: 60(34 users) Total Accepted: 34(30 users) Rating: Special Judge: No Description 给出一棵二叉树的中序和前序遍历,输出它的后序遍历. Input 本题有多组数据,输入处理到文件结束. 每组数据的第一行包括一个整数n,表示这棵二叉树一共有n个节点. 接下来的一行每行包括n个整数,表示这棵树的中序遍