您的位置:首页 > 其它

[hihocoder1049]后序遍历

2016-12-13 21:12 435 查看

问题描述

由树的前序、中序得到后序。具体参考hihocoder官网

算法简介

1. 由前序、中序重构树

因为数据很小,所以不需要考虑复杂度。作者采用了递归算法,利用前序找到根节点,然后利用中序切分左右子树,然后左右子树再递归构建。递归算法需要注意构造递归基。

2. 生成树的后序遍历

递归算法很简单,先左子树后序遍历,再右子树后序遍历,最后加上根节点即可。

全部代码

#include <iostream>
#include <cstring>

using namespace std;

struct Node{
char data;
Node *left,*right;

Node(char d):data(d),left(NULL),right(NULL) {}
Node(const Node &n):data(n.data),left(n.left),right(n.right) {}
~Node() {}

void clean() {
if (left) {
left->clean();
delete left;
}
if (right) {
right->clean();
delete right;
}
}

int postorder(char *str){
int len = 0;
if (left)
len = left->postorder(str);
if (right)
len += right->postorder(str+len);
str[len++] = data;
return len;
}
};

Node* build_tree(const char *pre,const char *mid,int pre_len,int mid_len){
if (pre_len == 0 || mid_len == 0)
return NULL;
Node* root = new Node(*pre);
int len_left = 0;
for (;len_left < mid_len && mid[len_left] != *pre;++len_left);
root->left = build_tree(pre+1,mid,len_left,len_left);
root->right = build_tree(pre+1+len_left,mid+len_left+1,pre_len-1-len_left,pre_len-1-len_left);
return root;
}

void trans_order(const char *pre,const char *mid,char *post){
Node *root = NULL;
int len;
root = build_tree(pre,mid,strlen(pre),strlen(mid));
if (root == NULL)
*post = 0;
else {
len = root->postorder(post);
post[len] = 0;
root->clean();
delete root;
}
}

int main()
{
char preorder[30],midorder[30],postorder[30];
cin >> preorder >> midorder;
trans_order(preorder,midorder,postorder);
cout << postorder << endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  hihocoder 遍历 递归