求先序排列

链接

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

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

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

比如中序: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)

全部评论

相关推荐

12-03 17:10
门头沟学院 Java
1说下tcp和udp的区别2说下浏览器输入url会发生什么3进程的通信方式4线程的通信方式5我看你实习写了数据库多表联查优化,数据库多表联查如何优化的6实习的多源异构数据问题,怎么解决的7构建统一网关,你这个api是写在网关上还是在哪里8你是如何进行数据清洗的&nbsp;你这个api是写在哪里的9实习时候针对mysql多表联查缓慢问题,具体如何解决的10springboot的启动注解是什么,具体有哪些子注解11http是无状态的,那怎么让它有状态的存放信息呢12你项目用了jwt是吧,那假如这时候我别人吩前获取到了你的jwt,它能实现登陆吗13jwt一般设置时效性,如何实现只能单次登陆14mysql的多表联查的join索引还能用吗亥作时15讲一下redis的zset的底层结构16ThreadLocal在你项目作用是什么,会有什么问题17讲下为什么会产生这些问题18你刚刚说到线程池容易数据错乱,假如我这时候线程池有个任务,需要读取主线程的俬以的据,主线程设置了ThreadLocal,可以有什么办法19linux用过吗,一般拿来做什么,常用的命令用过哪些20你们网关是如何设计的21mysql你说你用到了索引,那你说说索引失效的场景有哪些22最左前缀原则,比如创立了联合索引a,b,c,我输入where&nbsp;b=xx&nbsp;and&nbsp;c=xx索引生效吗,假如ba呢,bac生效吗(这里我觉得生效,但他好像不信)23你实习的数据库用了mysql和es,他们分别存储什么数据的一般
查看23道真题和解析
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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