Tree UVA - 548 已知中序遍历和后序遍历,求这颗二叉树。

You are to determine the value of the leaf node in a given binary tree that is the terminal node of a

path of least value from the root of the binary tree to any leaf. The value of a path is the sum of values

of nodes along that path.

Input

The input file will contain a description of the binary tree given as the inorder and postorder traversal

sequences of that tree. Your program will read two line (until end of file) from the input file. The first

line will contain the sequence of values associated with an inorder traversal of the tree and the second

line will contain the sequence of values associated with a postorder traversal of the tree. All values

will be different, greater than zero and less than 10000. You may assume that no binary tree will have

more than 10000 nodes or less than 1 node.

Output

For each tree description you should output the value of the leaf node of a path of least value. In the

case of multiple paths of least value you should pick the one with the least value on the terminal node.

Sample Input

3 2 1 4 5 7 6

3 1 2 5 6 7 4

7 8 11 3 5 16 12 18

8 3 11 7 16 18 12 5

255

255

Sample Output

1

3

255

/**
题目:Tree UVA - 548
链接:https://vjudge.net/problem/UVA-548
题意:算法竞赛入门经典P155 eg6-8
思路:后序遍历的最后一个为根。那么知道了根是多少,就可以在中序遍历找到根的位置,
根的左边为左子树,右边为右子树。左子树,右子树的后序遍历也可以通过原来的后序遍历中分成两部分获得。
后序遍历和中序遍历长度相同。
递归处理每一个结点即可。

收获:
char s[];
stringstream ss(s);
n = 0;
int x;
while(ss>>x) a[n++] = x;

处理一行由数字和空格组成的字符串,划分成数字的方式。
*/

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<int,int> P;
const int maxn = 1e4+100;
const int mod = 1e9+7;
int a[maxn], b[maxn], n;
struct node
{
    int value;
    node *left, *right;
    node():left(NULL),right(NULL){}
};
node *root;
char s[10*maxn];
void Input(char *s,int a[])
{
    stringstream ss(s);
    n = 0;
    int x;
    while(ss>>x) a[n++] = x;
}
node* build(int l,int r,int p)
{
    if(l>r){
        return NULL;
    }
    node *x = new node();
    int mid;
    for(int i = l; i <= r; i++){
        if(a[i]==b[p]){
            mid = i; break;
        }
    }
    x->value = a[mid];
    x->left = build(l,mid-1,p-1-(r-mid));///可推算出根的位置。
    x->right = build(mid+1,r,p-1);
    return x;
}
int ans, leaf;
void Find(node *root,int sum)
{
    if(root->left==NULL&&root->right==NULL){
        if(sum+root->value<ans){
            ans = sum + root->value;
            leaf = root->value;
        }else
        {
            if(sum+root->value==ans&&root->value<leaf){
                leaf = root->value;
            }
        }
    }else
    {
        if(root->left!=NULL){
            Find(root->left,sum+root->value);
        }
        if(root->right!=NULL){
            Find(root->right,sum+root->value);
        }
    }
}
int main()
{
    while(gets(s)!=NULL){
        Input(s,a);
        gets(s);
        Input(s,b);
        root = build(0,n-1,n-1);///中序遍历[0,n-1],第三个n-1表示根。
        ans = maxn*maxn;
        Find(root,0);
        printf("%d\n",leaf);
    }
    return 0;
}
时间: 2024-10-14 11:52:14

Tree UVA - 548 已知中序遍历和后序遍历,求这颗二叉树。的相关文章

二叉树遍历 已知中序后序遍历求前序遍历

已知中序.后序遍历求前序遍历的方法和已知前序.中序遍历求后序遍历的方法类似寻找根节点, 然后把中序遍历分成左右两个子树,有如此不断递归.很多文章介绍,不再累述. #include <iostream> #include <cstdio> #include <queue> #include <cstring> using namespace std; const int MAXN = 100; struct Node { char value; Node *l

已知二叉树的前序遍历、中序遍历或者中序遍历、后序遍历求二叉树结构的算法

二叉树中的前序遍历是先访问根结点,再访问左子树,右子树. 中序遍历是先访问左子树,再是根结点,最后是右子树. 后序遍历是先访问左子树,再是右子树,最后是根结点. 算法思路是先根据前序遍历的第一个结点或者后序遍历的最后一个结点,查找对应在中序遍历中的位置,就可以确定左子树包含的元素和右子树包含的元素,最后通过递归来实现就可以了. 二叉树的表示形式为 //二叉树的结构表示为 class TreeNode { int val; TreeNode left; TreeNode right; TreeNo

二叉树系列(二):已知中序遍历序列和后序遍历序列,求先序遍历序列

前面已经介绍过三种遍历方法的规则,为了大家看着方便,这里我们在重新介绍一遍: 1.先序遍历 (1)访问根结点: (2)先序遍历左子树: (3)先序遍历右子树.  2.中序遍历 (1)中序遍历左子树: (2)访问根结点: (3)中序遍历右子树. 3.后序遍历 (1)后序遍历左子树: (2)后序遍历右子树: (3)访问根结点. 知道了二叉树的三种遍历规则,只要有中序遍历序列和前后任一种遍历序列,我们就可以求出第三种遍历序列,今天我们研究的是已知中序和后序遍历序列,求先序遍历序列. 已知该二叉树的中序

已知一棵二叉树的中序遍历和后序遍历,求二叉树的先序遍历

[题解整理]二分题 题目类型: 二分查找: 二分答案. 大致解题思路: 查找注意有序和返回值: 浮点数注意精度: 整数注意返回值,建议另外维护一个变量,用于储存可行解. 题目 分类 传送门 WA点 poj 2785 二分查找 题解 lightoj 1088 二分查找 题解 lightoj 1307 二分查找 题解 longlong poj 2456 整数二分答案 题解 poj 3104 整数二分答案 题解 poj 3258 整数二分答案 题解 poj 3273 整数二分答案 题解 lightoj

二叉树--已知先序中序求后序--已知中序后序求先序(基本按照网上某大神思路搬过来的)

思路来自(转载自)  http://www.cnblogs.com/fzhe/archive/2013/01/07/2849040.html 题目描述不说了. 前序遍历:  GDAFEMHZ 中序遍历:  ADEFGHMZ 求中序遍历. 1 确定根,确定左子树,确定右子树. 2 在左子树中递归. 3 在右子树中递归. 4 打印当前根. 代码如下: 1 #include <bits/stdc++.h> 2 3 using namespace std; 4 char pr[1000],in[100

数据结构——已知先序中序求后序,已知中序后序求先序

总结下二叉树的已知两种遍历方式求第三种遍历顺序的方法,已知先序和中序遍历或者后序与中序遍历后二叉树是唯一确定的,下面介绍怎么求出第三种遍历顺序. 先序遍历顺序为:根结点——左子结点——右子结点,中序遍历为:左子结点——根结点——右子结点,我们注意到,先序遍历的第一个元素就是二叉树根结点,我们在中序遍历中以该元素分为左右两部分,则左边为左子树,右边为右子树,递归即可还原二叉树,这个过程中可直接输出后序遍历的顺序.同理,可以用后序与中序还原出先序遍历的顺序. 代码及测试数据如下: 1 #includ

72 中序遍历和后序遍历树构造二叉树

原题网址:https://www.lintcode.com/problem/construct-binary-tree-from-inorder-and-postorder-traversal/description 描述 根据中序遍历和后序遍历树构造二叉树 你可以假设树中不存在相同数值的节点 您在真实的面试中是否遇到过这个题?  是 样例 给出树的中序遍历: [1,2,3] 和后序遍历: [1,3,2] 返回如下的树: 2 /  \ 1    3 标签 二叉树 思路:要建立二叉树,首先要建立根

二叉查找树的前序遍历,后序遍历和中序遍历互求算法模板

面试的痛 前几天去阿里面试,一时忘记了二叉树的前序遍历中序遍历和后序遍历的概念,已经想死了. 然后最近去腾讯面试,被问到怎么已知前序遍历/后序遍历 + 中序遍历,求后序遍历/前序遍历,看来这种问题很喜欢考. 其实这个问题想清楚了很简单,只要把这三个概念理解透彻就可以做出来了,比如前序遍历的第一个值一定是根节点,然后这个根节点对应到中序遍历里面,在中序遍历的这个值的两边的值,一定在以此节点为根节点的两个子树上,同理,后序遍历也一样. 已知前序遍历和后序遍历是不能求唯一的中序遍历树的. #inclu

算法学习 - 表达树的建立(后缀表达式法),树的先序遍历,中序遍历,后序遍历

表达树就是根据后缀表达式来建立一个二叉树. 这个二叉树的每个叶子节点就是数,真祖先都是操作符. 通过栈来建立的,所以这里也会有很多栈的操作. 树的先序遍历,中序遍历,后序遍历的概念我就不讲了,不会的自行百度,不然也看不懂我的代码. 下面是代码: // // main.cpp // expressionTree // // Created by Alps on 14-7-29. // Copyright (c) 2014年 chen. All rights reserved. // #includ