题目链接:
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=104&page=show_problem&problem=489
题目类型: 数据结构, 二叉树
题目大意:
给两个组数字,都是在同一棵二叉树上的,第一组是按中序遍历(inorder)顺序输出的,第二组是按后序遍历(postorder)输出的,
根据这两组数据构建出原来的二叉树,然后计算从根结点到每个叶子结点的路径上的数字之和, 输出最小之和。
样例输入:
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
样例输出:
1
3
255
分析:
这题就是运用了二叉树重建, 以及遍历。
二叉树的遍历:先序遍历,中序遍历,后序遍历
只要有一个中序序列再加上另一个序列就可唯一地重建原来二叉树。
进行了二叉树重建之后,只要对这棵二叉树进行搜索, 取得各个路径之和,然后找出最小的那个和即可。
由中序遍历 分别和前序遍历,后序遍历进行建树的方法:
// 由中序和后序遍历序列进行建树, 返回根结点指针
Node * InPostCreateTree(int *mid,int *post,int len){
if(len == 0)
return NULL;
int i=len-1;
while(post[len-1] != mid[i])
--i;
Node *h=NewNode();
h->data=post[len-1];
h->left=InPostCreateTree(mid,post,i);
h->right=InPostCreateTree(mid+i+1,post+i,len-i-1);
return h;
}
// 由前序和中序遍历序列进行建树, 返回根结点的指针
Node * PreInCreateTree(int *mid,int *pre,int len) //n标识s2的长度
{
if(len==0)
return NULL;
int i = 0;
while(*mid != pre[i])
++i;
Node *h=NewNode();
h->data= *mid;
h->left = PreInCreateTree(mid+1, pre, i);
h->right = PreInCreateTree(mid+i+1, pre+i+1, len-i-1);
return h;
}
AC代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
const int MAXN = 10005;
int inOrder[MAXN], postOrder[MAXN], nIndex;
class Node{
public:
int data;
Node *left;
Node *right;
};
int nodeIndex;
Node node[MAXN];
vector<int>result;
vector<Node*>pResult;
bool flag;
int ans;
inline Node* NewNode(){
node[nodeIndex].left = NULL;
node[nodeIndex].right = NULL;
return &node[nodeIndex++];
}
inline void input(){
nIndex=1;
while(getchar()!='\n')
scanf("%d", &inOrder[nIndex++]);
// 输入第二行,后序遍历
for(int i=0; i<nIndex; ++i)
scanf("%d", &postOrder[i]);
}
// 由中序和后序遍历序列进行建树, 返回根结点指针
Node * InPostCreateTree(int *mid,int *post,int len){
if(len == 0)
return NULL;
int i=len-1;
while(post[len-1] != mid[i])
--i;
Node *h=NewNode();
h->data=post[len-1];
h->left=InPostCreateTree(mid,post,i);
h->right=InPostCreateTree(mid+i+1,post+i,len-i-1);
return h;
}
void dfs(Node *root, int n){
if(!root->left && !root->right){
result.push_back(n+root->data);
pResult.push_back(root);
return ;
}
if(root->left) dfs(root->left, n+root->data);
if(root->right) dfs(root->right, n+root->data);
}
int main(){
freopen("input.txt","r",stdin);
while(~scanf("%d", &inOrder[0])){
input();
nodeIndex = 0;
Node *root = InPostCreateTree(inOrder, postOrder, nIndex);
result.clear();
pResult.clear();
dfs(root, 0);
int minPos = 0;
for(int i=1; i<result.size(); ++i)
if(result[i] < result[minPos]) minPos=i;
printf("%d\n",pResult[minPos]->data);
}
return 0;
}
—— 生命的意义,在于赋予它意义。
分享到:
相关推荐
用C++写的二叉树先序遍历、中序遍历和后序遍历非递归算法
用C++写的,包括二叉树的构建,二叉树的先序遍历、中序遍历和后序遍历非递归算法。
/*选择二叉链式存储结构作为二叉树的存储结构,设计一个程序实现二叉树的基本操作(包括建立、输出、前序遍历、中序遍历、后序遍历、求树高、统计叶子总数等) 【实验内容】 必做内容 程序的菜单功能项如下: 1----...
### 根据先序与中序遍历结果建立二叉树 #### 一、问题背景与定义 在数据结构的学习中,二叉树是一种非常重要的非线性数据结构,广泛应用于计算机科学的多个领域,如搜索算法、编译器设计等。其中,二叉树的遍历是...
在计算机科学领域,数据结构是组织和管理...总结来说,二叉树的中序遍历是数据结构与算法的重要部分,递归实现则展示了编程中的优雅与效率。通过理解和掌握这个概念,开发者可以更好地设计和优化算法,解决复杂问题。
二叉树的遍历是对其进行操作和理解的关键部分,主要包括前序遍历、中序遍历和后序遍历。本话题将详细探讨如何根据给定的二叉树前序遍历和中序遍历的结果,利用Java来输出其后序遍历的序列。 前序遍历的顺序是:根...
在计算机科学领域,二叉树是一种特殊的图结构,其中每个节点最多有两个子节点,通常称为左子节点和右子节点...在实际编程中,二叉树的遍历方法常常与排序、搜索、数据压缩等任务相结合,为高效的数据处理提供强大支持。
二叉树的遍历有多种方式,本文将介绍二叉树的递归遍历,中序遍历,先序遍历和后序遍历。 递归遍历是指使用递归函数来遍历二叉树的每个结点。递归遍历的优点是代码简洁易懂,但缺点是可能会导致堆栈溢出。在本文的...
在IT领域,尤其是在数据结构与算法的学习中,中序遍历二叉树的非递归算法是一个关键且实用的知识点。通常,我们首先通过递归来实现二叉树的遍历,但递归方法可能因深度过大导致栈溢出,因此掌握非递归版本的遍历算法...
二叉树遍历问题 二叉树遍历问题-前序, 中序, 后序二叉树遍历问题-前序, 中序, 后序二叉树遍历问题-前序, 中序, 后序二叉树遍历问题-前序, 中序, 后序二叉树遍历问题-前序, 中序, 后序二叉树遍历问题-前序...
先根顺序建立二叉树,并对其进行线索化,实现先序遍历和中序遍历
数据结构C++二叉链表的先序遍历、中序遍历和后序遍历实现
在二叉树的遍历中,我们通常有三种主要的方式:前序遍历、中序遍历和后序遍历。这些遍历方法是理解二叉树数据结构的基础,广泛应用于搜索、排序和数据结构的操作。 标题和描述中提到的任务是实现二叉树的构建、前序...
### C语言实现二叉树的中序遍历(非递归) #### 背景介绍 在计算机科学中,二叉树是一种常见的数据结构,在算法设计与分析领域扮演着极其重要的角色。对于二叉树的操作主要包括查找、插入、删除以及各种形式的遍历...
数据结构课程实验代码,采用非递归,通过自己建立二叉树,完成中序遍历
在实际应用中,为了在非递归情况下高效地进行中序遍历,引入了线索二叉树的概念,特别是中序线索化二叉树。 中序线索化二叉树是在二叉链表的基础上进行修改,使得在任何时刻,通过线索可以确定某个节点是前驱还是...
### C语言实现二叉树的中序遍历(递归) #### 一、知识点概述 在计算机科学领域,二叉树是一种重要的数据结构,而遍历则是操作与处理这种数据结构的基本方法之一。二叉树的遍历可以分为三种基本方式:前序遍历、...
2. 遍历:对二叉树进行中序遍历,同时设置线索。在访问节点时,根据节点的位置和其父节点的指针更新线索。例如,当遍历到一个节点的左子节点时,将该节点设为其父节点的中序前驱;当遍历到一个节点的右子节点时,...
然而,在某些情况下,我们需要对二叉树进行遍历,以便获取其中的数据。在这种情况下,二叉树的中序线索化和遍历便成了一个重要的问题。 二叉树的中序线索化是指将二叉树转换成线索二叉树的过程。线索二叉树是一种...
**中序遍历** 是二叉树遍历的三种基本方法之一,其余两种为前序遍历和后序遍历。中序遍历遵循以下规则:首先访问左子树,然后访问根结点,最后访问右子树。这个过程可以递归地应用于每一个子树,也可以通过栈来实现...