[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 1049 后序遍历
- hihoCoder - 1049 - 后序遍历 (二叉树的重建!!)
- 【hihoCoder】1049.后序遍历
- [HihoCoder]#1049 : 后序遍历
- hihocoder 1049 后序遍历
- hihoCoder 1049 : 后序遍历 (二叉树遍历)
- hihocoder 1049 : 后序遍历
- hihocoder 1049后序遍历
- hihocoder 1049 : 后序遍历
- hihoCoder 1049 后序遍历
- hihocoder(1049) 后序遍历
- hihocoder 1049 后序遍历
- 【Hihocoder】#1049 : 后序遍历
- HihoCoder - 1049:后序遍历(递归)
- 【HIHOCODER 1049】 后序遍历
- HihoCoder1049 后序遍历 分治水题
- hihocoder 1049 后序遍历树
- hihoCoder 1049 : 后序遍历
- HihoCoder - 1049 后序遍历
- hihocoder-1049 后序遍历(分治)