求先序排列

链接

这题给出二叉树的中序序列和后序序列,要我们写出前序序列

我们可以通过递归调用中序序列和后序序列来构建完整的二叉树

接着直接输出前序序列,根据后序序列的特点,我们在中序序列中找到某一个根节点时,它对应的位置左边的子节点和后续序列位置相同,右节点同样相同

比如中序:BGDHAEFC 后序:GHDBFECA

A为根节点,在中序序列里,A的左边元素和后序前四个完全一样,A的右边和后序也完全一样(只有顺序不一样)

这是因为中序是左根右,而后序是左右根,也就是说,中序如果把根放在最后,元素就一样了,位置除外

#include<iostream>
#include<string>
#include<unordered_map>
using namespace std;
struct TreeNode {
	char data;
	TreeNode* left, * right;
	TreeNode(char x) :data(x), left(nullptr), right(nullptr){}
};
TreeNode* buildTree(string& inorder, string& postorder, int inStart, int inEnd, 
	int PostStart, int postEnd, unordered_map<char, int>& inMap) {
	if (inStart > inEnd || PostStart > postEnd) {
		return nullptr;
	}
	char Val = postorder[postEnd];
	int inIndex = inMap[Val];
	int leftInsize = inIndex - inStart;
	TreeNode* root = new TreeNode(Val);
	root->left = buildTree(inorder, postorder, inStart, inIndex - 1, PostStart, PostStart + leftInsize - 1, inMap);
	root->right = buildTree(inorder, postorder, inIndex + 1, inEnd, PostStart + leftInsize, postEnd-1, inMap);
	return root;
}
void preorder(TreeNode* root) {
	if (!root) return;
	cout << root->data;
	preorder(root->left);
	preorder(root->right);
}
void deletetree(TreeNode* root) {
	if (!root) return;
	deletetree(root->left);
	deletetree(root->right);
	delete root;
}
int main() {
	string inorder = "BGDHAEFC";
	string postorder = "GHDBFECA";
	unordered_map<char, int>inMap;
	for (int i = 0;i < inorder.size();i++) {
		inMap[inorder[i]] = i;
	}
	TreeNode* root = buildTree(inorder, postorder, 0, inorder.size() - 1, 0, postorder.size() - 1, inMap);
	preorder(root);
	deletetree(root);
	root = nullptr;
	return 0;
}

时间复杂度:O(n)

空间复杂度:O(n)

全部评论

相关推荐

本来是冲着朴朴的宣讲会去的,没想到全程还挺有意外收获~&nbsp;先说说整体感受,宣讲会挺真诚的,没什么虚头巴脑的套路,甚至听到有人说&nbsp;“杀鱼是真的”&nbsp;这种接地气的梗,还挺有意思😂&nbsp;不过宣讲里提到的轮班时间,我个人是真接受不了,这点一开始就有点打退堂鼓。宣讲结束后直接现场交简历&nbsp;+&nbsp;一轮面试,效率贼高!每个座位都发了个文件袋,里面有鼠标和朴朴的周边布包,算是校招里大方的了,这波礼品先蹭到~🎁一轮面试节奏快到飞起!面试官先让我做&nbsp;30&nbsp;秒自我介绍,刚说完就开启&nbsp;“连珠炮”&nbsp;模式,3&nbsp;分钟不到问了一堆问题,我现在就记得这几个:当时为什么选那家企业实习?对这次宣讲会有啥真实感受?大学生活里有没有什么遗憾?自己的缺点和不足在哪?用几个词总结一下自己?有没有担任过班委或学生会干部?其他问题脑子一懵全忘了,大概率是我回答得太一般,没接住面试官的节奏,一轮就被刷下来了😭&nbsp;后面听说第二轮是无领导小组讨论,没能体验到还挺可惜的。不过说真的,校招多跑一跑还挺值的,不光能积累面试经验,很多企业都会发礼品,我这阵子已经蹭到不少实用的小物件了~&nbsp;还在赶校招的兄弟姐妹们也加油,多试多练总能遇到合适的!💪
查看7道真题和解析
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务