算法竞赛入门经典 第二版 习题6-3 二叉树重建 Tree Recovery uva536
2017-04-08 20:50
435 查看
题目:https://vjudge.net/problem/UVA-673
思路:算是经典而基础的二叉树的题了,然而对我而言难度仍旧不小。
数组建树我还是很不熟练,于是用的指针。我利用string的find函数返回的下标在中序遍历中确定当前节点是否有左右子数,注意返回的是size_t类型,是种无符号整型。
顺便后序遍历时可以顺便将动态申请的空间释放,这样就不用单独释放空间了。
代码:C++
#include <iostream>
#include <cstdio>
#include <string>
#include <queue>
using namespace std;
string in, post;
deque<char> pre;
struct Node
{
char value;
Node *left;
Node *right;
Node(): left(NULL), right(NULL){}
Node(char c): value(c), left(NULL), right(NULL){}
};
Node *root;
void build(int now, Node *nowroot, int minn, int maxx)
{
if(pre.empty())
return;
char c = pre.front();
pre.pop_front();
if((int)in.find(c)<now&&(int)in.find(c)>minn)
{
nowroot->left = new Node(c);
build(in.find(c), nowroot->left, minn, now);
if(pre.empty())
return;
c = pre.front();
pre.pop_front();
}
if((int)in.find(c)>now&&(int)in.find(c)<maxx)
{
nowroot->right = new Node(c);
build(in.find(c), nowroot->right, now, maxx);
}
else
{
pre.push_front(c);
}
}
void dfs(Node *now)
{
if(now->left!=NULL)
{
dfs(now->left);
}
if(now->right!=NULL)
{
dfs(now->right);
}
post.push_back(now->value);
delete now;
}
int main()
{
string s;
while(cin >> s >> in)
{
post.clear();
for(auto t:s)
{
pre.push_back(t);
}
root = new Node(pre.front());
pre.pop_front();
char rootvalue = root->value;
build(in.find(rootvalue), root, -1, in.size());
if(root->left!=NULL)
{
dfs(root->left);
}
if(root->right!=NULL)
{
dfs(root->right);
}
post.push_back(rootvalue);
4000
cout << post << endl;
}
return 0;
}
思路:算是经典而基础的二叉树的题了,然而对我而言难度仍旧不小。
数组建树我还是很不熟练,于是用的指针。我利用string的find函数返回的下标在中序遍历中确定当前节点是否有左右子数,注意返回的是size_t类型,是种无符号整型。
顺便后序遍历时可以顺便将动态申请的空间释放,这样就不用单独释放空间了。
代码:C++
#include <iostream>
#include <cstdio>
#include <string>
#include <queue>
using namespace std;
string in, post;
deque<char> pre;
struct Node
{
char value;
Node *left;
Node *right;
Node(): left(NULL), right(NULL){}
Node(char c): value(c), left(NULL), right(NULL){}
};
Node *root;
void build(int now, Node *nowroot, int minn, int maxx)
{
if(pre.empty())
return;
char c = pre.front();
pre.pop_front();
if((int)in.find(c)<now&&(int)in.find(c)>minn)
{
nowroot->left = new Node(c);
build(in.find(c), nowroot->left, minn, now);
if(pre.empty())
return;
c = pre.front();
pre.pop_front();
}
if((int)in.find(c)>now&&(int)in.find(c)<maxx)
{
nowroot->right = new Node(c);
build(in.find(c), nowroot->right, now, maxx);
}
else
{
pre.push_front(c);
}
}
void dfs(Node *now)
{
if(now->left!=NULL)
{
dfs(now->left);
}
if(now->right!=NULL)
{
dfs(now->right);
}
post.push_back(now->value);
delete now;
}
int main()
{
string s;
while(cin >> s >> in)
{
post.clear();
for(auto t:s)
{
pre.push_back(t);
}
root = new Node(pre.front());
pre.pop_front();
char rootvalue = root->value;
build(in.find(rootvalue), root, -1, in.size());
if(root->left!=NULL)
{
dfs(root->left);
}
if(root->right!=NULL)
{
dfs(root->right);
}
post.push_back(rootvalue);
4000
cout << post << endl;
}
return 0;
}
相关文章推荐
- 算法竞赛入门经典(第2版)习题6-3 二叉树重建 UVa536
- 算法竞赛入门经典(第二版)第一章课后习题
- 算法竞赛入门经典(第二版) 习题3-4 周期串(Periodic Strigs) UVa455
- 二叉树习题之重建二叉树
- 《算法竞赛入门经典(第二版)》第三章习题(5-6)
- UVa201 Squares(算法竞赛入门经典第二版习题4-2)
- 算法竞赛入门经典(第二版) 习题3-5 谜题(Puzzle) UVa227 Finals1993
- 刘汝佳《算法竞赛入门经典(第二版)》习题(二)
- 算法竞赛入门经典(第二版)习题解答参考(第二章)
- 剑指Offer(第二版)面试题7:重建二叉树
- 算法竞赛入门经典 第二版 习题5-7 打印队列 Printer Queue uva12100
- 算法竞赛入门经典(第二版)习题解答参考(一)
- 习题6-3 二叉树的重建 UVa 536
- 《算法竞赛入门经典(第二版)》第三章 习题(6-9)
- 算法竞赛入门经典 第二版 习题9-1最长滑雪路径 Longest Run on a Snowboard uva10285
- 算法竞赛入门经典 第二版 习题4-4 骰子涂色 Cube painting uva253
- 习题6-3 二叉树重建(Tree Recovery, ULM 1997, UVa 536)
- 习题2-5 分数化小数 (算法竞赛入门经典(第二版)刘汝佳 第二章 )
- 算法竞赛入门经典(第二版)第二章课后习题
- 算法竞赛入门经典(第二版)-刘汝佳-第七章 暴力求解法 习题(2/18)