uva548 -- Tree
来源:互联网 发布:unity3d圣典 编辑:程序博客网 时间:2024/05/29 07:57
题目链接
这一题输入二叉树的中序序列和后序序列,让求一个叶子结点使此叶子节点到根节点路径的权值和最小。这题主要有以下几个问题:1、输入方式;2、根据中序和后序序列建立二叉树;3、使用DFS求权值和最小的叶子结点。我是看了刘汝佳的《算法竞赛入门经典》后才做的这题的,所以代码大体上和刘的相同,输入也是采用stringstream,只是在书中刘是采用数组的方式实现的二叉树,在我的代码中我将其改为指针的方式。具体代码如下:
#include <iostream>#include <cstdio>#include <string>#include <sstream>using namespace std;struct Node{ int value; Node* left; Node* right; Node():value(0),left(NULL),right(NULL){}};const int N=10000+10;int inOrder[N]; //中序序列int postOrder[N]; //后序序列int n; //中序与后序序列的长度int least; //最小的权和bool input(int *a) //输入函数{ string line; if(!getline(cin,line)) return false; stringstream ss(line); n=0; int val; while(ss>>val) a[n++]=val; return n>0;}//inOrder[L1,R1],postOrder[L2,R2]Node* buildTree(int L1,int R1,int L2,int R2) //建立二叉树{ if(L1>R1) return NULL; Node* root=new Node(); root->value=postOrder[R2]; int pos=0; for(;pos<n;pos++) if(inOrder[pos]==postOrder[R2]) break; int cnt=pos-L1; root->left=buildTree(L1,pos-1,L2,L2+cnt-1); root->right=buildTree(pos+1,R1,L2+cnt,R2-1); return root;}void dfs(Node* root,Node*& bestNode,int sum){ if(root==NULL) return; sum+=root->value; if(root->left==NULL&&root->right==NULL) { if(sum<least||sum==least&&root->value<bestNode->value) { least=sum; bestNode=root; } return; } dfs(root->left,bestNode,sum); dfs(root->right,bestNode,sum);}int main(){ //freopen("test.txt","r",stdin); while(input(inOrder)) { input(postOrder); Node* root=buildTree(0,n-1,0,n-1); int sum=0; Node* bestNode=root; least=100000000; dfs(root,bestNode,sum); cout<<bestNode->value<<endl; } return 0;}
做完这一题后,如果还没做过根据先序序列和后序序列建立二叉树,可以做uva536,来加深一下建立二叉树的操作。我的关于uva536的题解在此。
0 0
- uva548 Tree
- UVA548 - Tree
- UVA548- Tree
- Tree UVA548
- uva548 - Tree
- tree uva548
- uva548 Tree
- uva548 -- Tree
- Uva548——Tree
- Uva548 Tree 二叉树遍历
- UVA548
- UVA548
- uva548
- uva548
- Uva548
- UVA548
- UVA548
- UVA548
- muduo库 AtomicIntergerT原子操作模板类
- 多态的实现机制
- yum 源的搭建以及rpm命令
- 斐波那契数列
- 不正经运维狗的文档9
- uva548 -- Tree
- 进阶篇:等待多个子线程完毕再执行主线程的方法之CountDownLatch(十二)
- GDOI2017模拟04.12总结
- 二叉树的基本操作(五)——2-3树的概念
- VC学习1: 函数返回类实例的方法
- 用java实现数据挖掘中的向量求相似度
- M/在Makefile中进行宏定义-D
- SAS驱动中PHY和PORT的介绍
- ACM Fibonacci数