求先序排列

链接

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

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

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

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

全部评论

相关推荐

1.&nbsp;这个面是HR面还是技术面呢?2.&nbsp;你之前是在成都那个公司实习过一段时间是吗,对。那你就是这家公司是怎么部署的?3.&nbsp;办是服务器,是那种Linux服务器个吗?还是怎样?4.&nbsp;那部署是那种K8S部署吗?Docker部署,还是直接java&nbsp;-jar的那种部署?Docker部署?那你对dock命令熟悉吗?熟悉一些。你能简单说几个命令吗?5.&nbsp;如果想把一个目录映射一下,你是怎么做的呢?6.&nbsp;给你一个场景,就比如说访问你们的服务,所有的接口,所有的接口都很卡了,会怎么去排查定位这个问题呢?7.&nbsp;你刚刚说到jstack,具体看哪些信息呢?8.&nbsp;那jstack是排查什么问题呢?你知道吗?9.&nbsp;除&nbsp;了jstack,&nbsp;还有用过其他的一些JDK的一些分析工具吗?10.&nbsp;那如果说。不在前面,就是他的后端。如果是在数据库层面的,会怎么去排查定位有问题呢?11.&nbsp;那索引一般会怎么创建呢?你先说一下它的语法吧。12.&nbsp;那创建索引一般是怎么创建呢?你会怎么设计呢?哪些字段?什么类型?13.&nbsp;创建索引的时候,为什么比较适合用比如说自增的方式,为什么要选用这种方式呢?14.&nbsp;那比如说创建索引之后,索引有哪些场景会使它失效呢?15.&nbsp;那如果说他的问题发生在比如Java层面,它的一些业务处理比较耗时,你会怎么去优化,就比如说Java层面的一些性能问题。16.&nbsp;然后我再或者说你刚刚说的多线程,多线程你是怎么去管理实现的呢。17.&nbsp;线程池的话,有哪些参数呢?你知道它的类是哪个吗?18.&nbsp;拒绝策略有哪些呢?19.&nbsp;觉得这几种具体策略适用于哪些场景,你会怎么选择呢?20.&nbsp;那你知道JUC下面包的一些类吗?21.&nbsp;好,知道ReentrantLock吗?22.&nbsp;你觉得他们(synchronized和ReentrantLock)有什么区别?23.&nbsp;你知道AQS的数据结构吗?24.&nbsp;他的那个state的变量是用什么修饰的呢?25.&nbsp;volatile有什么特性呢?26.&nbsp;怎么保证可见性呢?27.&nbsp;你能说一下JVM的JVM这块吗?就比如说JVM的,它的那个运行时数据区分为哪些?28.&nbsp;虚拟机栈里面是它的单位是什么呢?栈帧里面存哪些信息呢。29.&nbsp;平常的话。会怎么学习呢?平常学习得通过什么方式学习?30.&nbsp;你有用过AI一些IDE嘛,就比如说cursor或者trae这种。31.&nbsp;cursor用的少,是因为他要付费吗?还是什么原因?32.&nbsp;你之后是。有想在哪里发展吗?33.&nbsp;你老家是哪的?34.&nbsp;东部,东部是哪个城市?35.&nbsp;我们这边的话其实。我们这边可能对AI拥抱力度会比较大一点xxxx巴拉巴拉36.&nbsp;你这边还有什么问题吗?(询问日常实习和转正面试规格不一致的情况)37.&nbsp;你现在是。本科生是吗?后年毕业嘛?38.&nbsp;你这几年绩点是多少呢?39.&nbsp;你这块大概能实习多久呢?40.&nbsp;那如果说有转正机会是不是也可以,如果而且我们公司比较满意的话。41.&nbsp;最快能够什么时候入职呢?
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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