从前序遍历和中序遍历求后续遍历

这道题是我面试360的一道面试题,本来面试官的意思估计是让我按照上篇中所说的从前序和中序求出一棵树,但后来估计被我引导错了,这是我自己给自己挖坑啊,不过其实如果会做从前序和中序求出树的话,这道题其实也不难了。

这道题假设所有的遍历序列都是以字符串存储的,所以需要从前序和中序字符串求出后序字符串。这道题当然可以先求出树然后再进行后序遍历。不过也可以不建树而直接求后序字符串。思路是从先序中找到根,并将根插入后序串的末尾,然后从中序中找出左右子树,因为后序遍历的顺序是左右根,所以接下来需要先递归遍历右子树,再递归遍历左子树,这样在递归遍历结束时就可以从后往前生成后序遍历序列。

class Solution{
public:
	string postOrder(string preOrder,string inOrder){
		string result;
		if(preOrder.empty() || inOrder.empty()){
		    return result;
		}
		post(preOrder,inOrder,result);
		return result;

	    
	}
	void post(string preOrder,string inOrder,string &postOrder){
		if(preOrder.empty() || inOrder.empty())
			return;
		string curStr = preOrder.substr(0,1); 
		if(postOrder.empty())
			postOrder = curStr;
		else
			postOrder.insert(0,curStr);
		int i = inOrder.find(curStr);
		string leftIn = inOrder.substr(0,i); 
		string rightIn = inOrder.substr(i + 1);
		string leftPre = preOrder.substr(1,leftIn.length());
		string rightPre = preOrder.substr(leftIn.length() + 1);		
		post(rightPre,rightIn,postOrder);
		post(leftPre,leftIn,postOrder);
	}
};
这道题当时在面试时也是做的一塌糊涂,首先是对C++string的判空不能用NULL,这些常识性错误肯定会给面试官留下不好的印象,确实需要注意一些C++与java的不同之处,抓基础啊抓基础!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值