关于使用中加 前/后简历二叉树

news/2024/7/20 22:04:19 标签: 算法, 深度优先

中加后

unordered_map<int, int> pos;
	TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
		int n = inorder.size();
		for (int i = 0; i < n; i++) {
			pos[inorder[i]] = i;     //记录中序遍历的根节点位置
		}
		return dfs(inorder, postorder, 0, n - 1, 0, n - 1);
	}
	TreeNode* dfs(vector<int>& inorder, vector<int>& postorder, int il, int ir, int pl, int pr) {
		if (il > ir) return nullptr;
		int k = pos[postorder[pr]];   //中序遍历根节点位置
		TreeNode* root = new TreeNode(postorder[pr]); //创建根节点
		root->left = dfs(inorder, postorder, il, k - 1, pl, pl + k - 1 - il);
		root->right = dfs(inorder, postorder, k + 1, ir, pl + k - 1 - il + 1, pr - 1);
		return root;
	}

根据二叉树的性质,我们可以依次采取下述步骤:

1、先利用后序遍历找根节点:后序遍历的最后一个数,就是根节点的值;

2、在中序遍历中找到根节点的位置 k,则 k 左边是左子树的中序遍历,右边是右子树的中序遍历;

3、假设il,ir对应子树中序遍历区间的左右端点, pl,pr对应子树后序遍历区间的左右端点。那么左子树的中序遍历的区间为 [il, k - 1],右子树的中序遍历的区间为[k + 1, ir];

4、由步骤3可知左子树中序遍历的长度为k - 1 - il + 1,由于一棵树的中序遍历和后序遍历的长度相等,因此后序遍历的长度也为k - 1 - il + 1。这样,根据后序遍历的长度,我们可以推导出左子树后序遍历的区间为[pl, pl + k - 1 - il],右子树的后序遍历的区间为[pl + k - 1 - il + 1, pr - 1];

仅凭文字可能不太好理解上述推导过程,我们画张图来辅助理解:

左右子树中序和后序遍历的边界确定是这道题最大的难点,理解了这点,这道题也就做完了一大半。

如何在中序遍历中对根节点快速定位?

具体过程如下:

1、创建一个哈希表pos记录记录每个值在中序遍历中的位置。
2、先利用后序遍历找根节点:后序遍历的最后一个数,就是根节点的值;
3、确定左右子树的后序遍历和中序遍历,先递归创建出左右子树,然后创建根节点;
4、最后将根节点的左右指针指向两棵子树;

同理 前加中

class Solution {
public:
	unordered_map<int, int> pos;

    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
        int n = inorder.size();
		for (int i = 0; i < n; i++) {
			pos[inorder[i]] = i;     //记录中序遍历的根节点位置
		}
		//return dfs(inorder, postorder, 0, n - 1, 0, n - 1);
		return pfs(preorder, inorder, 0, n - 1, 0, n - 1);
    }
  TreeNode* pfs(vector<int>& preorder, vector<int>& inorder, int il, int ir, int pl, int pr) {
		if (il > ir || pl > pr ) return nullptr;
		int k = pos[preorder[pl]];   //中序遍历根节点位置
		TreeNode* root = new TreeNode(preorder[pl]); //创建根节点
		root->left = pfs(preorder, inorder, il, k - 1, pl + 1, k - il + pl);
		root->right = pfs(preorder, inorder,  k + 1, ir, pr + 1 - ir + k, pr);
		return root;
	}
};


http://www.niftyadmin.cn/n/5434058.html

相关文章

【ESP32接入国产大模型之MiniMax】

1. MiniMax 讲解视频&#xff1a; ESP32接入语言大模型之MiniMax MM智能助理是一款由MiniMax自研的&#xff0c;没有调用其他产品的接口的大型语言模型。MiniMax是一家中国科技公司&#xff0c;一直致力于进行大模型相关的研究。 随着人工智能技术的不断发展&#xff0c;自然语…

bsdtar 归档程序在保留文件特殊属性上比 GNU tar 更全面和简便

&#xff08;首发地址&#xff1a;学习日记 https://www.learndiary.com/2024/03/bsdtar/ &#xff09; 大家好&#xff0c;我是淘宝网“学习日记小店”的 Linux 服务提供者 learndiary。今天我将重点分享关于 BSD 版 tar 工具—— bsdtar&#xff08;libarchive版本&#xff…

Jetpack Compose 动画正式开始学习

1. 简单值动画 //将一个Color简单值 从一个值 变化到另一个 另一个简单值 就用 animateColorAsStateval backgroundColor by animateColorAsState(if (tabPage TabPage.Home) Purple100 else Green300) 动画其实就是 一个状态不停发生改变导致 组件不断重组产生的过程 2.…

springCloudeAlibaba的使用

父pom文件&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.o…

8:00面试,8:06就出来了,问的问题有点变态。。。

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到9月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40%…

关于使用elementUI中select和el-checkbox-group的回显问题

网上看到很关于这个的问题回显&#xff0c;各式各样&#xff0c;没有绝句自己的问题&#xff0c;总重问题出在数据格式上 select和el-checkbox-group el-checkbox 都是字符串数组格式&#xff1a;[12,13,....]; 我写的格式是id是选中的id组成的回显数据格式&#xff1b; 如…

字符分类函数(iscntrl、i是space.....)---c语言

目录 一、定义二、字符分类函数2.1 -iscntrl&#xff08;&#xff09;2.1.1定义2.1.2使用举例 2.2 -isspace&#xff08;&#xff09;2.2.1描述2.2.2使用举例 2.3-isdigit()2.3.1描述2.3.2使用举例 2.4-isxdigit()2.4.1描述 2.5-islower()2.5.1描述2.5.2使用举例 2.6-isupper()…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:TextTimer)

通过文本显示计时信息并控制其计时器状态的组件。 说明&#xff1a; 该组件从API Version 8开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 无 接口 TextTimer(options?: TextTimerOptions) 参数&#xff1a; 参数名参数类型…