6-3 二叉树的重建 uva536

已知先序和中序  求后序

可以有两种方式输出

一种是建好树按照树输出

一种是不建树  在遍历的过程中存入vector  再倒叙输出

#include<bits/stdc++.h>
using namespace std;

int ri[1000];int le[1000];
char xian[30],zhong[30];vector<char>ans;

int built(int x1,int y1,int x2,int y2)
{
    if(x2>y2||x1>y1)return 0;

    char root=xian[x1];
     ans.push_back(root);
    int p=x2;
    while(zhong[p]!=root)p++;
    int cnt=p-x2;

     ri[root]=built(x1+cnt+1,y1,x2+cnt+1,y2);
     le[root]=built(x1+1,x1+cnt,x2,x2+cnt-1);
    return root;

}

void dfs(int root)
{

    if(le[root]){dfs(le[root]);}
    if(ri[root]){dfs(ri[root]);}
    printf("%c",root);
    return;
}

int main()
{

    while(scanf("%s %s",xian+1,zhong+1)==2)
    {  ans.clear();

        int n=strlen(xian+1);

       int root=built(1,n,1,n);

       //for(int i=ans.size()-1;i>=0;i--)
      //  cout<<ans[i];
      dfs(root);
       cout<<endl;

    }

    return 0;
}

原文地址:https://www.cnblogs.com/bxd123/p/10317679.html

时间: 2024-10-28 19:55:32

6-3 二叉树的重建 uva536的相关文章

hihoCoder - 1049 - 后序遍历 (二叉树的重建!!)

#1049 : 后序遍历 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 在参与过了美食节之后,小Hi和小Ho在别的地方又玩耍了一阵子,在这个过程中,小Ho得到了一个非常有意思的玩具--一棵由小球和木棍连接起来的二叉树! 小Ho对这棵二叉树爱不释手,于是给它的每一个节点都标记了一个标号--一个属于A..Z的大写字母,并且没有任意两个节点的标号是一样的.小Hi也瞅准了这个机会,重新巩固了一下小Ho关于二叉树遍历的基础知识~就这样,日子安稳的过了两天. 这天,小Ho正好

[树结构]二叉树的重建和序列化

二叉树的重建 几乎所有的人都知道二叉树可以根据前序遍历+中序遍历或者后序遍历+中序遍历的方式重新建立原来的二叉树,并且结果是唯一的.下面就来看一下相关的方法. 前序+中序重建二叉树 给定一棵二叉树的前序和中序遍历序列,重新建立这棵二叉树. 注意:在前序中确定了根节点以后,要去中序里面查找这个根节点,这时的查找没必要从数组的0下面开始,从这个树的中序的第一个点开始.然后查找的个数为停止的下表减去中序开始的下表. 这里重建二叉树用的是递归的方法,要注意递归的出口.不然会死循环. 所以代码实现: Tr

二叉树重建[UVA-536]

二叉树重建Tree Recovery(UVA-536,ULM1997)  时间限制3000ms 分别是书上习题6-3,涉及到二叉树这一数据结构中已知两种遍历求整个树的过程. 首先需要复习一下二叉树的前序遍历和中序遍历和后序遍历.二叉树的前序遍历是指,先输出根结点的值,然后依次递归调用遍历左右子树:中序遍历是指,先递归遍历左子树,然后输出根结点的值,然后递归遍历右子树:后续遍历是指,先递归遍历左右子树,然后输出根结点的值.下面的解题分析都是以此为基础的. 以第一个样例输入为例: 先序遍历:DBAC

二叉树的重建

class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; } } /**  * 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.  * 假设输入的前序遍历和中序遍历的结果中都不含重复的数字.  * 例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},  * 则重建二叉树并返回.  * @author user  *  *  *

【编程之美】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

利用层序遍历(不含None)和中序遍历重建二叉树 python

给定一颗二叉树的层序遍历(不含None的形式)和中序遍历序列,利用两个序列完成对二叉树的重建. 还是通过一个例子来说明整个过程,下图所示的二叉树,层序遍历结果为[a,b,c,d,e],中序遍历结果为[d,b,a,c,e],我们知道当我们找到根节点后,中序遍历能够提供给我们的信息就是左右子树分别包含哪些节点,而我们能否在层序遍历中找到根节点呢?很明显,层序遍历序列的第一个点是根节点,在中序遍历中找到左右子树分别包含哪些节点之后,我们就可以在层序遍历中区分出左右子树的层序遍历结果,然后就可以分别开始

递归重建二叉树的思路

(1)通过前序列表(根左右) 和 中序列表(左跟右)来重建二叉树 思路 前序遍历 序列中,第一个数字总是二叉树的根节点.在中序遍历 序列中,根节点的值在序列的中间,左子树的节点的值位于根节点的值的左边,右子树的节点的值位于根节点的值的右边.根据二叉树的这个性质,采用递归方法可以重建一个二叉树了. /** * Definition for binary tree * public class TreeNode { * int val; * TreeNode left; * TreeNode rig

二叉树学习(一)

树的基础知识 树的定义: 树包含n(n ≥≥ 0 )个节点,n = 0时称为空树. 在树的结构关系中,有且仅有一个节点没有前趋节点,这个节点称为树的根节点. 除根节点外,树中其他的节点有且仅有一个前趋节点,但可以有很多后继节点.如图,A为根节点. 树的基本术语: 结点的度:每个节点具有的子树的个数(后继节点的个数)称为该节点的度:A的度为3,B的度为0.(节点的度 = 节点的孩子节点 = 节点的后继节点) 树的度:树中所有节点的度的最大值:图中树的度为3.(树的度 取 所有节点度的最大值) 分枝

根据先序遍历和中序遍历建立二叉树

title: 根据先序遍历和中序遍历建立二叉树 date: 2019-07-23 22:37:34 tags: 数据结构 问题 已知一棵二叉树的先序遍历以及中序遍历,重建二叉树.二叉树的每一个节点有三个属性,左子节点,右子节点,以及节点值. 思路 先序遍历服从规则“根左右”,所以由此可知,对于一个先序遍历得到的数组,第一个元素一定是根节点: 中序遍历服从规则”左根右“,所以由此可知,对于一个中序遍历得到的数组,根节点左边的元素都属于根节点的左子树,而根节点右边的元素都属于根节点的右子树: 所以,