NYOJ-756重建二叉树

重建二叉树

时间限制:1000 ms  |  内存限制:65535 KB

难度:3

描述

题目很简单,给你一棵二叉树的后序和中序序列,求出它的前序序列(So easy!)。

输入

输入有多组数据(少于100组),以文件结尾结束。
每组数据仅一行,包括两个字符串,中间用空格隔开,分别表示二叉树的后序和中序序列(字符串长度小于26,输入数据保证合法)。

输出

每组输出数据单独占一行,输出对应得先序序列。

样例输入

ACBFGED ABCDEFG

CDAB CBAD

样例输出

DBACEGF

BCAD

 //从后序中找到根(最后一个结点),然后确定根在中序中的位置,从而可以将中序序列分为左右子序列,后序中按此左序列的长度确定的序列即为后序左序列,

//后序中剩下的序列去掉根即为后序右序列,递归建树,然后NLR遍历

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct node{
    char data;
    struct node *lchild,*rchild;
}BitNode,*BiTree;
void GetPreorder(char *last,char *mid,BiTree &T,int len)
{
    if(!len)
    {
        T = NULL;
        return;
    }
    char ch = last[len-1];//得到根结点
    int index = 0;//索引记录根结点在中序中的位置
    while(mid[index] != ch) index ++;
    T = (BiTree)malloc(sizeof(BitNode));//为根结点开辟空间
    T->data = ch;
    //递归建立左子树和右子树
    GetPreorder(last,mid,T->lchild,index);
    GetPreorder(last+index,mid+index+1,T->rchild,len-index-1);
}
void Preorder(BiTree T)
{
    if(T)
    {
        putchar(T->data);
        Preorder(T->lchild);
        Preorder(T->rchild);
    }
}
int main()
{
    char mid[26],last[26];
    while(scanf("%s%s",last,mid) != EOF)
    {
        BiTree T;
        GetPreorder(last,mid,T,strlen(mid));//last,mid接收字符串后系统自动加‘\0‘
        Preorder(T);
        puts("");
    }
    return 0;
}

补充:如果已知前序、中序,求后序

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct node{
    char data;
    struct node *lchild,*rchild;
}BitNode,*BiTree;
void GetPostorder(char *pre,char *mid,BiTree &T,int len)
{
    if(!len)
    {
        T = NULL;
        return;
    }
    char ch = pre[0];//得到根结点
    int index = 0;//索引记录根结点在中序中的位置
    while(mid[index] != ch) index ++;
    T = (BiTree)malloc(sizeof(BitNode));//为根结点开辟空间
    T->data = ch;
    //递归建立左子树和右子树
    GetPostorder(pre+1,mid,T->lchild,index);
    GetPostorder(pre+index+1,mid+index+1,T->rchild,len-index-1);
}
void Postorder(BiTree T)
{
    if(T)
    {
        Postorder(T->lchild);
        Postorder(T->rchild);
        putchar(T->data);
    }
}
int main()
{
    char pre[26],mid[26];
    while(scanf("%s%s",pre,mid) != EOF)
    {
        BiTree T;
        GetPostorder(pre,mid,T,strlen(pre));
        Postorder(T);
        puts("");
    }
    return 0;
}
//前、中
//DBACEGF ABCDEFG  ACBFGED
//ABCDEFG BCDAGFE  DCBGFEA

参照:http://www.tuicool.com/articles/jaiAVj

时间: 2024-08-09 14:47:54

NYOJ-756重建二叉树的相关文章

nyoj 756 重建二叉树

重建二叉树主要是给你一颗二叉树的前序遍历的结果和中序遍历的结果或者后序遍历的结果或者中序遍历的结果,让你求出其中的后序遍历的结果或者前序遍历的结果,这里知道其中的两个就能求出第三个,但是知道的两个必须要有中序遍历,求这样的问题主要有两种方式,一种是把树建立起来,然后在遍历就行了,还有一种常用的方式是不用建树直接遍历. 第一种方式: 建立二叉树,然后进行遍历 1 2 #include <stdio.h> 3 #include <stdlib.h> 4 #include <str

nyist oj 756 重建二叉树

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

nyoj重建二叉树(不真的建立)

  感觉c++很陌生啊 题目很简单,给你一棵二叉树的后序和中序序列,求出它的前序序列(So easy!). 输入 输入有多组数据(少于100组),以文件结尾结束.每组数据仅一行,包括两个字符串,中间用空格隔开,分别表示二叉树的后序和中序序列(字符串长度小于26,输入数据保证合法). 输出 每组输出数据单独占一行,输出对应得先序序列. 样例输入 ACBFGED ABCDEFG CDAB CBAD 样例输出 DBACEGFBCAD #include<iostream> #include<me

重建二叉树_C++

一.题目背景 给定一个二叉树的前序和中序遍历,求出它的后序遍历 二叉树的遍历可参考 http://blog.csdn.net/fansongy/article/details/6798278/ 二.算法分析 例如下面这个二叉树 它的先序遍历为:DBACEGF 它的中序遍历为:ABCDEFG 它的后序遍历为:ACBFGED 先用一个指针指向先序遍历第一个字符,即树的根节点D 然后在中序遍历找到D,将此遍历划分为ABC和EFG,因为中序遍历按照左中右的结构,可知在D左边为其左子树,右边为其右子树 进

数据结构重建二叉树

重建二叉树,知道先序和中序   输出二叉树的后序.. #include <iostream> #include <cstdio> #include <cstring> using namespace std; const int M = 1005; int i,j,k; int Max (int x ,int y) { return x>y?x:y ; } void build(int n,char *s1,char *s2) { if(n<=0) retu

第3章 结构之法——重建二叉树

重建二叉树 问题描述 分析与解法 用java实现的代码如下: 1 package chapter3jiegouzhifa.RebuildBinTree; 2 3 /** 4 * 重建二叉树 5 * 递归解法 6 * @author DELL 7 * 8 */ 9 public class RebuildBinTree { 10 //定义节点类 11 public static class Node{ 12 int left; //左子树位置 13 int right; //右子树位置 14 ch

根据二叉树的前序遍历和中序遍历重建二叉树

题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回. 1 /** 2 * Definition for binary tree 3 * struct TreeNode { 4 * int val; 5 * TreeNode *left; 6 * TreeNode *right; 7 * TreeNode(

【编程之美】java实现重建二叉树

package com.cn.binarytree.utils; /** * @author 刘利娟 [email protected] * @version 创建时间:2014年7月20日 下午2:03:30 类说明: */ class Node { Node left; Node right; char chValue; Node(char chValue) { left = null; right = null; this.chValue = chValue; } } public cla

根据前序和中序重建二叉树

注意:1.仅根据前序和后序无法构建唯一的二叉树:2.二叉树前序遍历,第一个数字总是树的根节点的值:3.中序遍历中,根节点的值在序列的中间,左子树的值子在根节点的值的左边,右字树的值在根节点的值的右边:4.思路:递归 #include <iostream> #include <stdlib.h> using namespace std; struct Node{ int value; Node* left; Node* right; }; Node* ConstructCore(in

剑指offer 重建二叉树

重建二叉树 题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回 思路:首先找到root,然后递归的重建root -> left,root -> right. /** * Definition for binary tree * struct TreeNode { * int val; * TreeNod