【巩固算法基础:二叉树遍历序列重建】(xx序 + 中序)

文章介绍了如何使用递归方法将给定的前序遍历和中序遍历序列转换为后序遍历序列或重构为二叉树,提供了C++代码示例,展示了`build`函数在两种场景中的应用。
摘要由CSDN通过智能技术生成

就以infix-order和prefix-order举例,尝试还原后序遍历序列吧,其他情况都是类似的

这个问题一般分两种:

一种是还原出一个序列(sequence + sequence -> sequence)

另外一种是还原出一颗二叉树(sequence + sequence -> binary tree)

代码分别如下:写的比较规范,可作为模板使用,仅作为参考

void build(
	std::vector<int> const & preorder,
	std::vector<int> const & inorder,
	std::vector<int> & postorder,
	int preorder_first,
	int inorder_first,
	int postorder_last,
	int current_length){
	if(! current_length) return;
	if(1 == current_length)
		return (void)(postorder[postorder_last - 1] = preorder[preorder_first]);
	postorder[postorder_last - 1] = preorder[preorder_first];
	int p { inorder_first };
	while(! (inorder[p] == preorder[preorder_first])) ++ p;
	build(preorder, inorder, postorder, preorder_first + 1, preorder_first + 1, p, p - preorder_first);
	build(preorder, inorder, postorder, preorder_first + p - inorder_first + 1, p + 1, postorder_last, current_length - p - 1);
}

std::vector<int> build(std::vector<int> const & preorder, std::vector<int> const & inorder){
	auto length { static_cast<int>(preorder.size()) };
	std::vector<int> postorder(length);
	postorder.reserve(length << 1 | 1);
	build(preorder, inorder, postorder, 0, 0, length, length);
	return postorder;
}
void build(
	std::vector<int> const & preorder,
	std::vector<int> const & inorder,
	int preorder_first,
	int preorder_last,
	int inorder_first,
	int inorder_last,
	Node ** const Ot){
	(void) std::exchange( *Ot, new Node {} );
	(*Ot)->value = preorder[preorder_first];
	auto m { inorder_first };
	while(! (m == inorder_last) && ! (preorder[preorder_first] == inorder[m])) ++ m;
	if(m == inorder_last - 1) return (void) std::exchange((*Ot) -> right, nullptr);
	if(m == inorder_first) return (void) std::exchange((*Ot) -> left, nullptr);
	auto length_left { m - inorder_first };
	build(preorder, inorder, preorder_first + 1, preorder_first + 1 + length_left, inorder_first, m, &((*Ot) -> left));
	build(preorder, inorder, preorder_first + 1 + length_left, preorder_last, m + 1, inorder_last, &((*Ot) -> right));
}
template <typename = void>

Node *build(std::vector<int> const & preorder, std::vector<int> const & inorder){
	auto length { static_cast<int>(preorder.size()) };
	std::vector<int> postorder(length);
	postorder.reserve(length << 1 | 1);
	Node *root {nullptr};
	build(preorder, inorder, 0, length, 0, length, &root);
	return root;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

XNB's Not a Beginner

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值