uva548 -- Tree
2017-04-12 22:31
375 查看
题目链接
这一题输入二叉树的中序序列和后序序列,让求一个叶子结点使此叶子节点到根节点路径的权值和最小。这题主要有以下几个问题:1、输入方式;2、根据中序和后序序列建立二叉树;3、使用DFS求权值和最小的叶子结点。我是看了刘汝佳的《算法竞赛入门经典》后才做的这题的,所以代码大体上和刘的相同,输入也是采用stringstream,只是在书中刘是采用数组的方式实现的二叉树,在我的代码中我将其改为指针的方式。具体代码如下:
做完这一题后,如果还没做过根据先序序列和后序序列建立二叉树,可以做uva536,来加深一下建立二叉树的操作。我的关于uva536的题解在此。
这一题输入二叉树的中序序列和后序序列,让求一个叶子结点使此叶子节点到根节点路径的权值和最小。这题主要有以下几个问题: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 ; //中序序列 int postOrder ; //后序序列 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的题解在此。
相关文章推荐
- Tree UVA - 548
- uva 548 Tree
- uva 548 - Tree
- uva-548 Tree
- uva_ 548-Tree
- 【日常学习】【二叉树遍历】Uva548 - Tree题解
- UVa 548 Tree (中序遍历&后序遍历&DFS)
- UVa 548 - Tree
- UVa 548 - Tree
- uva548 Tree
- uva 548 Tree
- UVA 548 Tree
- UVA - 548 Tree 二叉树
- UVA 548 - Tree
- UVa 548 - Tree(二叉树)
- UVa 548 - Tree
- 548 - Tree uva - 深搜 + 建树
- uva 548 Tree
- uva 548 tree 树
- UVA - 548 Tree