码迷,mamicode.com
首页 > 其他好文 > 详细

[hiho 10]由前序中序遍历求后序遍历

时间:2015-05-04 01:10:02      阅读:219      评论:0      收藏:0      [点我收藏+]

标签:

题目描述

分治思想,递归求解。

 

先建树再后序遍历:

#include <iostream>
#include <algorithm>
#include <cstring>

using namespace std;

char pre[26], mid[26];

typedef
struct _tree {
	char c;
	_tree *lc, *rc;
	_tree(char ch) {
		c = ch;
	}
} Tree, *PTree;

PTree makeTree(int pb, int mb, int len) {
	if (len <= 0) return nullptr;
	char root_char = pre[pb];
	int idx;
	for (idx = mb; idx < mb + len; idx++) {
		if (mid[idx] == root_char) {
			break;
		}
	}
	PTree root = new Tree(root_char);
	root->lc = makeTree(pb + 1, mb, idx - mb);
	root->rc = makeTree(pb + 1 + idx - mb, idx + 1, mb + len - idx - 1);
	return root;
}

void post_traverse(PTree root) {
	if (root == nullptr) return;
	post_traverse(root->lc);
	post_traverse(root->rc);
	cout << root->c;
}

int main() {
	cin >> pre >> mid;
	int len = strlen(pre);
	PTree root = makeTree(0, 0, len);
	post_traverse(root);

	return 0;
}

 

实际上建树过程是可以略去的,处理时直接输出后序遍历结果:

#include <iostream>
#include <algorithm>
#include <cstring>

using namespace std;

char pre[26], mid[26];

void solve(int pb, int mb, int len) {
	if (len <= 0) return;
	char root_char = pre[pb];
	int idx;
	for (idx = mb; idx < mb + len; idx++) {
		if (mid[idx] == root_char) {
			break;
		}
	}
	solve(pb + 1, mb, idx - mb);
	solve(pb + 1 + idx - mb, idx + 1, mb + len - idx - 1);
	cout << root_char;
}

int main() {
	cin >> pre >> mid;
	int len = strlen(pre);
	solve(0, 0, len);

	return 0;
}

[hiho 10]由前序中序遍历求后序遍历

标签:

原文地址:http://www.cnblogs.com/xblade/p/4475021.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!