您的位置:首页 > 其它

算法竞赛入门经典 第二版 习题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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: