二叉树的构建(已知两个遍历结果,来构建二叉树)

2024-05-03 14:28

本文主要是介绍二叉树的构建(已知两个遍历结果,来构建二叉树),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

一、从前序与中序遍历构建二叉树

方法一:再构建两个数组,进行存储分割的左右子树

方法二:哈希映射

二、从中序和后序遍历构造二叉树


一、从前序与中序遍历构建二叉树

假如有这样一棵二叉树,它的前序遍历为1 2 4 5 3 6 ,中序遍历为 4 2 5 1 6 3

图文分析:

根节点为前序遍历的第一个节点

然后通过前序遍历得到的根节点以及形成的中序遍历结构进行左右子树划分

代码演示:

方法一:再构建两个数组,进行存储分割的左右子树

class Solution {
public:TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {if (preorder.size() == 0) return NULL;int pos = 0, n = preorder.size();while (inorder[pos] != preorder[0])pos += 1; //找到中序遍历中的根节点位置TreeNode* root = new TreeNode(preorder[0]);vector<int> preArr;// 存储前序遍历的结果vector<int> inArr; // 存储中序遍历的结果//获得根节点的左子树for (int i = 1; i <= pos; i++) preArr.push_back(preorder[i]); //前序遍历左子树的结果for (int i = 0; i <= pos; i++) inArr.push_back(inorder[i]); //中序遍历左子树的结果root->left = buildTree(preArr, inArr);preArr.clear();inArr.clear();//获得根节点的右子树for (int i = pos + 1; i < n; i++) preArr.push_back(preorder[i]); //前序遍历右子树的结果for (int i = pos + 1; i < n; i++) inArr.push_back(inorder[i]); //中序遍历右子树的结果root->right = buildTree(preArr, inArr);return root;}
};

方法二:哈希映射

这个方法更便于我们找到根节点所在中序遍历的位置

class Solution {
private:unordered_map<int, int> pos;public:TreeNode* dfs(const vector<int>& preorder, const vector<int>& inorder, int pl, int pr, int il, int ir) {if (pl > pr) return nullptr;// 前序遍历中的第一个节点就是根节点int k = pos[preorder[pl]]; // 在中序遍历中定位根节点// 先把根节点建立出来TreeNode* root = new TreeNode(preorder[pl]);int len = k - il;// 得到左子树中的节点数目// 递归地构造左子树,并连接到根节点// 先序遍历中「从 左边界+1 开始的 size_left_subtree」个元素就对应了中序遍历中「从 左边界 开始到 根节点定位-1」的元素root->left = dfs(preorder, inorder, pl + 1, pl + len, il, k - 1);// 递归地构造右子树,并连接到根节点// 先序遍历中「从 左边界+1+左子树节点数目 开始到 右边界」的元素就对应了中序遍历中「从 根节点定位+1 到 右边界」的元素root->right = dfs(preorder, inorder, pl + len + 1, pr, k + 1, ir);return root;}TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {int n = preorder.size();// 构造哈希映射,帮助我们快速定位根节点for (int i = 0; i < n; ++i) {pos[inorder[i]] = i;}return dfs(preorder, inorder, 0, n - 1, 0, n - 1);}
};

二、从中序和后序遍历构造二叉树

图文演示:

假如有这样一棵二叉树,它的后序遍历为4 5 2 6 3 1 ,中序遍历为 4 2 5 1 6 3.

代码演示:哈希映射

class Solution {
public:unordered_map <int, int>pos;TreeNode* dfs(vector<int>& inorder, vector<int>& postorder, int il, int ir, int pl, int pr) {if (il > ir) return NULL;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 - il, pr - 1);return root;}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);}
};

三、根据前序和后序遍历构造二叉树​​​​​​

这个知前序和后序遍历构建的二叉树得到的二叉树不唯一

代码演示:(双指针法)

考虑到后序遍历的倒数第二个节点刚好为右节点。

class Solution {
public:int preIndex = 0, posIndex = 0;TreeNode* constructFromPrePost(vector<int>& preorder, vector<int>& postorder) {TreeNode* root = new TreeNode(preorder[preIndex++]);if (root->val != postorder[posIndex]) root->left = constructFromPrePost(preorder, postorder);if (root->val != postorder[posIndex]) root->right = constructFromPrePost(preorder, postorder);posIndex++;return root;}
};

这篇关于二叉树的构建(已知两个遍历结果,来构建二叉树)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/956949

相关文章

使用Docker构建Python Flask程序的详细教程

《使用Docker构建PythonFlask程序的详细教程》在当今的软件开发领域,容器化技术正变得越来越流行,而Docker无疑是其中的佼佼者,本文我们就来聊聊如何使用Docker构建一个简单的Py... 目录引言一、准备工作二、创建 Flask 应用程序三、创建 dockerfile四、构建 Docker

C# 比较两个list 之间元素差异的常用方法

《C#比较两个list之间元素差异的常用方法》:本文主要介绍C#比较两个list之间元素差异,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. 使用Except方法2. 使用Except的逆操作3. 使用LINQ的Join,GroupJoin

MySQL存储过程之循环遍历查询的结果集详解

《MySQL存储过程之循环遍历查询的结果集详解》:本文主要介绍MySQL存储过程之循环遍历查询的结果集,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言1. 表结构2. 存储过程3. 关于存储过程的SQL补充总结前言近来碰到这样一个问题:在生产上导入的数据发现

基于Python构建一个高效词汇表

《基于Python构建一个高效词汇表》在自然语言处理(NLP)领域,构建高效的词汇表是文本预处理的关键步骤,本文将解析一个使用Python实现的n-gram词频统计工具,感兴趣的可以了解下... 目录一、项目背景与目标1.1 技术需求1.2 核心技术栈二、核心代码解析2.1 数据处理函数2.2 数据处理流程

Python FastMCP构建MCP服务端与客户端的详细步骤

《PythonFastMCP构建MCP服务端与客户端的详细步骤》MCP(Multi-ClientProtocol)是一种用于构建可扩展服务的通信协议框架,本文将使用FastMCP搭建一个支持St... 目录简介环境准备服务端实现(server.py)客户端实现(client.py)运行效果扩展方向常见问题结

详解如何使用Python构建从数据到文档的自动化工作流

《详解如何使用Python构建从数据到文档的自动化工作流》这篇文章将通过真实工作场景拆解,为大家展示如何用Python构建自动化工作流,让工具代替人力完成这些数字苦力活,感兴趣的小伙伴可以跟随小编一起... 目录一、Excel处理:从数据搬运工到智能分析师二、PDF处理:文档工厂的智能生产线三、邮件自动化:

详解如何使用Python从零开始构建文本统计模型

《详解如何使用Python从零开始构建文本统计模型》在自然语言处理领域,词汇表构建是文本预处理的关键环节,本文通过Python代码实践,演示如何从原始文本中提取多尺度特征,并通过动态调整机制构建更精确... 目录一、项目背景与核心思想二、核心代码解析1. 数据加载与预处理2. 多尺度字符统计3. 统计结果可

python进行while遍历的常见错误解析

《python进行while遍历的常见错误解析》在Python中选择合适的遍历方式需要综合考虑可读性、性能和具体需求,本文就来和大家讲解一下python中while遍历常见错误以及所有遍历方法的优缺点... 目录一、超出数组范围问题分析错误复现解决方法关键区别二、continue使用问题分析正确写法关键点三

一文教你Java如何快速构建项目骨架

《一文教你Java如何快速构建项目骨架》在Java项目开发过程中,构建项目骨架是一项繁琐但又基础重要的工作,Java领域有许多代码生成工具可以帮助我们快速完成这一任务,下面就跟随小编一起来了解下... 目录一、代码生成工具概述常用 Java 代码生成工具简介代码生成工具的优势二、使用 MyBATis Gen

Python使用Reflex构建现代Web应用的完全指南

《Python使用Reflex构建现代Web应用的完全指南》这篇文章为大家深入介绍了Reflex框架的设计理念,技术特性,项目结构,核心API,实际开发流程以及与其他框架的对比和部署建议,感兴趣的小伙... 目录什么是 ReFlex?为什么选择 Reflex?安装与环境配置构建你的第一个应用核心概念解析组件