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

就以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;
}

  • 19
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 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、付费专栏及课程。

余额充值