从前序与中序遍历序列构造二叉树(C++实现)

从前序与中序遍历序列构造二叉树

  • 题目
  • 思路分析
  • 代码
  • 代码讲解

题目

在这里插入图片描述

思路分析

在这里插入图片描述

  • 我们可以通过递归实现的二叉树构建函数。它根据给定的先序遍历序列和中序遍历序列构建一棵二叉树,并返回根节点
  • 可以创建一个_build 函数,该函数负责构建二叉树的节点,通过分割先序遍历序列和中序遍历序列,并递归构建左子树和右子树来完成整个二叉树的构建过程。
  • 最终,buildTree 函数调用 _build 函数,并返回构建的二叉树的根节点。

代码

class Solution {
public:
    TreeNode* _build(vector<int>& preorder, vector<int>& inorder, int& peri, int begin, int end) 
    {
         // 如果开始索引大于结束索引,则返回空指针,表示当前子树为空
         if (begin > end) {
             return nullptr;
         }
         int rooti = 0;
         // 在中序遍历序列中找到当前根节点的索引
         while (rooti <= end) {
             if (inorder[rooti] == preorder[peri]) {
                 break;
             }
             rooti++;
         }
         // 创建当前根节点
         TreeNode* root = new TreeNode(preorder[peri++]);
         
         // 构建左子树
         // 左子树的先序遍历序列为 [begin, rooti-1]
         // 左子树的中序遍历序列为 [begin, rooti-1]
         root->left = _build(preorder, inorder, peri, begin, rooti-1);
         
         // 构建右子树
         // 右子树的先序遍历序列为 [rooti+1, end]
         // 右子树的中序遍历序列为 [rooti+1, end]
         root->right = _build(preorder, inorder, peri, rooti+1, end);
         return root;
    }

    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) 
    {
        int i = 0;
        // 调用内部函数 _build 构建二叉树
        // 初始时 peri 为 0,表示从先序遍历序列的第一个元素开始构建
        // 根据先序遍历序列和中序遍历序列构建二叉树,并返回根节点
        TreeNode* root = _build(preorder, inorder, i, 0, preorder.size()-1);
        return root;
    }
};

代码讲解

首先判断起始索引 begin 是否大于结束索引 end,如果是,则说明当前子树为空,返回空指针。

在中序遍历序列 inorder 中找到当前根节点的索引 rooti,该索引表示根节点在中序遍历中的位置。在循环中,不断遍历中序遍历序列,直到找到与先序遍历序列 preorder[peri] 相等的值。找到后,rooti 就是根节点的索引。

创建当前根节点,节点的值为 preorder[peri]。

根据先序遍历序列和中序遍历序列的特性,可以将当前子树分为左子树和右子树。左子树的先序遍历序列为 preorder[begin, rooti-1],左子树的中序遍历序列为 inorder[begin, rooti-1]。右子树的先序遍历序列为 preorder[rooti+1, end],右子树的中序遍历序列为 inorder[rooti+1, end]。

递归调用 _build 函数,分别构建左子树和右子树,并将返回的根节点设置为当前根节点的左孩子和右孩子。

返回当前根节点。


总结:
在 buildTree 函数中,首先定义了一个变量 i,初始值为 0,作为 _build 函数中 peri 的初始值。然后调用 _build 函数,传入先序遍历序列 preorder、中序遍历序列 inorder、i、0 和 preorder.size()-1,即整个序列的起始和结束索引。最后返回构建的二叉树的根节点。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/190049.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【深入剖析K8s】容器技术基础(三):深入理解容器镜像 文件角度

容器里的进程‘看到’’的文件系统 可能你立刻就能想到,这应该是&#xff3f;个关于MountNamespace的问题:容器里的应用进程理应‘看到”一套完全独立的文件系统这样它就可以在自己的容器目录&#xff08;比如&#xff0f;tmp&#xff09;下进行操作’而完全不会受宿主机以及其…

DataGrip 2023.2.3(IDE数据库开发)

DataGrip是一款数据库集成开发环境&#xff08;IDE&#xff09;&#xff0c;用于数据库管理和开发。 DataGrip提供了许多强大的功能&#xff0c;如SQL语句编辑、数据库连接管理、数据导入和导出、数据库比较和同步等等。它支持多种数据库&#xff0c;如MySQL、PostgreSQL、Ora…

CSDN动态发了但是主页面看不见已发的动态

问题描述&#xff1a; 今天在写csdn动态的时候&#xff0c;发了五个动态&#xff0c;但是主页面的“最近”看不到我发的动态&#xff0c;我还以为是csdn动态每天的发送量有数量限制。去这个地方点我的发现 右上角全是“审核中”的字样 按理说是不可能审核这么久的&#xff08…

Arduino驱动温湿度气压光照传感器模块

目录 一、简介二、原理图三、使用方法四、实验现象 一、简介 点击图片购买 HTU21D特性&#xff1a;HTU21D基于法国Humirel公司高性能的湿度感应元件制成&#xff0c;传感器输出标准IIC格式。同时具有很高的温度精度和湿度精度。HTU21专为低功耗小体积应用设计&#xff0c;具有很…

【挑战业余一周拿证】CSDN官方课程目录

一、亚马逊云科技简介 二、在云中计算 三、全球基础设施和可靠性 四、联网 五、存储和数据库 六、安全性 七、监控和分析 八、定价和支持 九、迁移和创新 十、云之旅 关注订阅号 CSDN 官方中文视频&#xff08;免费&#xff09;&#xff1a;点击进入 一、亚马逊云科…

90. 打家劫舍II (房子围成一圈)

题目 题解 class Solution:def rob(self, nums: List[int]) -> int:def dp(nums: List[int]) -> int:N len(nums)# 定义状态&#xff1a;dp[i]表示从第i个房屋开始偷窃&#xff0c;能够偷到的最高金额dp [0 for i in range(N)]for i in range(N-1, -1, -1):if i N-1:…

【二叉树】oj题

在处理oj题之前我们需要先处理一下之前遗留的问题 在二叉树中寻找为x的节点 BTNode* BinaryTreeFind(BTNode* root, int x) {if (root NULL)return NULL;if (root->data x)return root;BTNode* ret1 BinaryTreeFind(root->left, x);BTNode* ret2 BinaryTreeFind(ro…

Alfred v5.1.4(mac快速启动)

Mac效率办公软件哪个好&#xff1f;Alfred是一款Mac电脑上的快速启动和工作流自动化工具&#xff0c;它可以帮助用户快速访问文件、应用程序、web搜索和系统工具&#xff0c;提高工作效率。以下是Alfred的特点&#xff1a; 快速启动&#xff1a;用户可以通过Alfred快速启动应用…

scipy 笔记:scipy.spatial.distance

1 pdist 计算n维空间中观测点之间的成对距离。 scipy.spatial.distance.pdist(X, metriceuclidean, *, outNone, **kwargs) 1.1 主要参数 X一个m行n列的数组&#xff0c;表示n维空间中的m个原始观测点metric使用的距离度量out输出数组。如果非空&#xff0c;压缩的距离矩阵…

Dempster-Shafer(D-S)证据理论的基本定义和详细分析,优点,缺点,应用!!(系列1)

文章目录 前言一、D-S证据理论的应用&#xff1a;二、D-S证据理论的优点&#xff1a;三、D-S证据理论的缺陷&#xff1a;四、D-S组合规则&#xff1a;总结 前言 Dempster-Shafer&#xff08;D-S&#xff09;证据理论是一种不精确推理理论&#xff0c;也称为Dempster/Shafer证据…

深度学习第2天:RNN循环神经网络

☁️主页 Nowl &#x1f525;专栏《机器学习实战》 《机器学习》 &#x1f4d1;君子坐而论道&#xff0c;少年起而行之 文章目录 介绍 记忆功能对比展现 任务描述 导入库 处理数据 前馈神经网络 循环神经网络 编译与训练模型 模型预测 可能的问题 梯度消失 梯…

python 笔记 根据用户轨迹+基站位置,估计基站轨迹+RSRP

1 问题描述 已知用户实际的轨迹&#xff0c;和基站的位置&#xff0c;能不能得到用户所连接的基站&#xff0c;以及基站的信号强度RSRP&#xff1f; 1.1 几个假设 这里我们做几个假设&#xff1a; 每个用户有80%的概率连接最近的基站&#xff0c;有20%的概率选择其他的基站连…

在mysql存储过程中间部分,使用游标遍历动态结果集(游标动态传参使用)

mysql游标动态传参实现&#xff08;动态游标&#xff09; 1.问题2.需求描述3.实现3.1.使用3.2.代码&#xff08;直接看这都可以&#xff09; 1.问题 众所周知&#xff0c;mysql存储过程功能是没有oracle的包功能强大的&#xff0c;但是在去O的趋势下&#xff0c;mysql存储过程的…

使用git下载远程所有分支到本地

使用git下载远程所有分支到本地&#xff1a; 打开gitbash 输入以下命令即可&#xff1a; git clone git地址 cd git文件夹 git branch -r | grep -v \-> | while read remote; do git branch --track "${remote#origin/}" "$remote"; done git fetch -…

灭火器二维码巡检卡制作教程

每个消防器材生成独立二维码&#xff0c;取代传统纸质巡检卡&#xff0c;微信扫码巡检&#xff0c;巡检记录汇总后台&#xff0c;随时登录后台查看导出数据&#xff0c;管理人员绑定凡尔码小程序即可随时了解消防巡检完成情况。 生成灭火器巡检码流程图&#xff1a; 1、开通后…

百家号MCN是什么?百家号MCN禁止拉子账号怎么解决?

在当今数字化时代&#xff0c;社交媒体平台已成为人们获取信息、分享观点和创作内容的重要渠道之一。百家号作为百度旗下的自媒体平台&#xff0c;吸引了众多创作者和机构入驻&#xff0c;以分享优质内容并获得收益。在百家号上&#xff0c;MCN矩阵扮演着重要的角色&#xff0c…

目标检测原理

一、什么是目标检测 目标检测的任务是找出图像中所有感兴趣的目标&#xff08;物体&#xff09;&#xff0c;确定他们的类别和位置&#xff0c;是计算机视觉领域的核心问题之一。由于各类物体有不同的外观、形状、姿态&#xff0c;再加上光照、遮挡等因素的干扰&#xff0c;目…

如何在Node.js和Express中设置TypeScript(2023年)

如何在Node.js和Express中设置TypeScript&#xff08;2023年&#xff09; 在这篇文章中&#xff0c;我们将介绍在Express应用程序中设置TypeScript的最佳方法&#xff0c;了解与之相关的基本限制。 文章目录 如何在Node.js和Express中设置TypeScript&#xff08;2023年&#x…

RT-DETR 更换损失函数之 SIoU / EIoU / WIoU / Focal_xIoU

文章目录 更换方式CIoUDIoUEIoUGIoUSIoUWIoUFocal_CIoUFocal_DIoUFocal_EIoUFocal_GIoUFocal_SIoU提示更换方式 第一步:将ultralytics/ultralytics/utils/metrics.py文件中的bbox_iou替换为如下的代码:class

图书管理系统源码,图书管理系统开发,图书借阅系统源码三框架设计原理和说明

TuShuManger项目简介和创建 这里一共设计了6个项目,主要是借助三层架构思想分别设计了主要的三层,包括model实体层,Dal数据库操作层,Bll业务调用层,其他有公共使用项目common层,DButitly提取出来的数据库访问层,下面我们分别创建每个项目和开始搭建整个过程 TuShuManger…