Hihocoder 1049 后续遍历

此题根据提示,可知要用分治思想。

任何一棵树都可以分为左子树和右子树,分治到最后必定为:

根节点,只有根节点的左子树,只有根节点的右子树。


此题前序和中序已知,那我们可以根据前序遍历知道根节点。

然后可知 中序遍历为 左+根+右。它的左就是它左子树的中序遍历结果,右就是右子树的中序遍历结果。

如果我们可以知道前序遍历的 左子树和右子树的结果的话,那我们就可以用递归的方法得到了。

又因为 一个树的左子树和右子树的长度是知道的,所以我们可以根据长度来定位前序的左子树和右子树的前序遍历结果,

后续遍历的结果就是 左+右+根

我们设计一个函数为

string FindPostorder(string preorder, string inorder) ;

它的返回结果为 return FindPostorder(preorderL, inorderL) + FindPostOrder(preorderR, preorderR) + root;

上代码:


#include<iostream>
#include<string>
#include<sstream>
using namespace std;

string FindPostOrder(string preorder, string inorder)
{
	if (preorder.empty())return "";
	if (preorder.length() == 1 ) return preorder;
	char rootChar = preorder[0];
	stringstream strStream;
	strStream << rootChar;
	string root = strStream.str();
	int x = inorder.find(root);
	string inorderL = inorder.substr(0, x);
	string inorderR = inorder.substr(x + 1, inorder.length());
	string preorderL;
	string preorderR;
	preorderL.assign(preorder, 1, inorderL.length());
	preorderR.assign(preorder, 1+preorderL.length(), preorder.length());
	
	return FindPostOrder(preorderL, inorderL) + FindPostOrder(preorderR, inorderR) + (string)root;
}

int main()
{
	string A, B;
	cin >> A >> B;
	cout<<FindPostOrder(A, B);
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值