构造二叉树(已知前序遍历,中序遍历,求后序遍历)

news2024/11/18 9:26:29

 

此题涉及到的<unordered_map>所建立的哈希表,没有多复杂,但对构造树方面确是很方便,

有时候掌握一些这样的额外知识,对编程大有帮助,例如vector容器,string类型等等。千里之行,始于足下。不停积累编程会更上一层楼

std::unordered_map<int,int>indexMap;

 

#include<iostream>
#include<unordered_map>
#include<string>
using namespace std;
//节点结构体
struct TreeNode {
    char val;
    TreeNode* left;
    TreeNode* right;
    TreeNode(char val) :val(val), left(nullptr), right(nullptr) {}
};

// 递归构造二叉树
TreeNode* buildTreeRecursive(string& preorder, string& inorder, int preStart, int inStart, int inEnd, unordered_map<int, int>& indexMap)
{
    if (preStart > preorder.size() - 1 || inStart > inEnd)
    {
        return nullptr;
    }
    //根据前序遍历的结果获得当前子树的根节点值
    char rootValue = preorder[preStart];
    TreeNode* root = new TreeNode(rootValue);
    //根据中序遍历结果获取当前子树的根节点在中序遍历的索引
    int rootIndex = indexMap[rootValue];
    //递归构造左子树和右子树
    root->left = buildTreeRecursive(preorder, inorder, preStart + 1, inStart, rootIndex - 1, indexMap);
    root->right = buildTreeRecursive(preorder, inorder, preStart + rootIndex - inStart + 1, rootIndex + 1, inEnd, indexMap);
    return root;//左递归建立完成后,进行右递归,右递归完成后,一步步回退,最后root就是整棵树的根节点
}

//建立哈希表,调用建树函数
TreeNode* builTree(string& preorder, string& inorder)
{
    //创建一个哈希表,用于快速查找中序遍历结果中节点值对应的索引
    std::unordered_map<int, int>indexMap;
    for (int i = 0; i < inorder.size(); ++i)
    {
        indexMap[inorder[i]] = i;//inedx[i]为字符串类型,隐式转换为整数类型
    }

    // 递归构造二叉树
    return buildTreeRecursive(preorder, inorder, 0, 0, inorder.size() - 1, indexMap);
}

//后序遍历二叉树
void postorderTraversal(TreeNode* root)
{
    if (root == nullptr)
        return;
    postorderTraversal(root->left);//这里的递归需要自己对照简单案例模拟一下
    postorderTraversal(root->right);//在确定当前节点的左子树和右子树已经全部访问完了,才可以访问当前节点
    cout << root->val;
}

int main()
{
    string s;
    while (getline(cin, s))
    {
        string preorder = "", inorder = "";
        int i;
        for (i = 0; s[i] != ' '; i++)//这么做是因为分开前序和中序字符串
        {
            preorder += s[i];
        }
        i++;
        for (; i < s.size();i++)
        {
            inorder += s[i];
        }
        TreeNode* root = builTree(preorder, inorder);//返回根节点
        postorderTraversal(root);
        cout << endl;
    }

    return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

GE WES5302-150 数字量控制模块

GE WES5302-150 是一款数字量控制模块&#xff0c;通常用于工业自动化和控制系统中&#xff0c;主要用于数字信号的输入和输出控制。以下是该模块的一些主要产品功能&#xff1a; 数字量输入&#xff1a;WES5302-150 模块通常具有多个数字输入通道&#xff0c;用于接收数字信号…

浏览量5.54亿,“平替大军”击退“钱包刺客”?丨小红书消费趋势分析

当代年轻人的消费观念&#xff0c;从贷款买大牌的“精致穷”&#xff0c;逐渐演变为人间清醒式地购物...他们爱上麦当劳的“穷鬼套餐”&#xff0c;爱喝瑞辛9.9元畅饮&#xff0c;爱和小学生成为“饭搭子”吃小饭桌&#xff0c;爱买低价打折出售的剩菜盲盒&#xff0c;爱出门吃…

Java“牵手”淘宝商品列表页数据采集+淘宝商品价格数据排序,淘宝API接口申请指南

淘宝商城商品平台介绍如下&#xff1a; 淘宝网是亚洲最大的购物网站&#xff0c;由阿里巴巴集团于2003年5月创立。淘宝网在不断发展的过程中&#xff0c;逐步形成了具有特色的购物网站。淘宝商城是淘宝网全新打造的B2C购物平台&#xff0c;成立于2008年4月10日。随着淘宝网规模…

用户参数(zabbix-agent)

-s 指向被监控端地址 -p 指向被监控端端口 -k 指向key的名字 监控内存使用率 agent vi a.conf server web界面 对数据库的avg进行监控 systemctl 创建监控项 另一台 重启 agent 监控请求数 运行时间 对自定义key的理解 写下想要监控的任何参数命令&#xff0c;利用zabbix…

【C++面向对象侯捷】1.C++编程简介

文章目录 视频来源&#xff1a;我的百度网盘

arcgis 面要素相交

假设有绿色面图层和紫色面图层&#xff0c;绿色图层有两个区域aa和bb&#xff0c;现在想得到紫色图层分别落在aa和bb上的部分&#xff0c;并附上属性值。 要用到相交功能。 ArcToolbox - Analysis Tools - Overlay - Intersect 输入&#xff1a;把涉及到的两个图层都输入进去…

【工具】咸鱼之王辅助小助手来了!

自动答题的视频演示&#xff1a;【工具】咸鱼之王辅助小助手来了!_哔哩哔哩_bilibili 刚开始搞&#xff0c;还没来得及做界面&#xff0c;目前只做了自动答题。 欢迎感兴趣的大佬一起来开发~

使用Leaflet对WMS做空间几何范围查询

一、需求 使用GeoServer发布的WMS服务对WMS做空间范围查询&#xff0c;默认情况下WMS支持点击查询&#xff0c;网上有很多的资料不在赘述。那么WMS做几何查询该怎么实现呢&#xff1f; 二、实现路径 查询WMS查询的服务参数&#xff0c;WMS支持三种请求方式&#xff1a;GetCapa…

git 私有创建分支,合并及发布主干

文章目录 概要整体架构流程技术细节小结 概要 整体架构流程 例如&#xff1a; clone 复制代码下载地址到本地文件夹&#xff0c;并显示在idea上面new Branch 创建新的分支Repositories 本地资源&#xff0c;从本地资源创建分支Romote 远程 技术细节 提示&#xff1a;这里可…

为了这辆 G9,小鹏「砍了10个高管」

作者 | 张祥威 编辑 | 德新 “在25到30万之间的中高端SUV市场做到中国第一。” 9月19日&#xff0c;小鹏G9 2024款上市&#xff0c;何小鹏再战G9。 2024款的小鹏G9 共有5个版本&#xff1a; •650 Max 35.99万元 •702 Max 30.99万元 •570 Max 28.99万元 •702 Pro 28.39万…

ctf web基础php

1.preg_match函数绕过 1.数组绕过 <?php $pass$_GET[zx]; if(!preg_match("/admin/",$zx)false){die(hacker); } echo flag; ?> ?zx[]admin 2.换行符绕过 <?php $pass$_GET[zx]; if(!preg_match("/^.(admin).$/",$zx)false){die(hacker)…

兽医诊所温湿度失衡,该如何止损?

在现代社会中&#xff0c;宠物已经成为家庭的一员&#xff0c;人们越来越重视宠物的健康和幸福。兽医诊所作为照顾和治疗宠物的重要场所&#xff0c;不仅承担着宠物医疗护理的责任&#xff0c;还肩负着确保宠物在诊所内舒适、安全的任务。 然而&#xff0c;很多时候&#xff0c…

JMeter接口测试之文件上传

最近用JMeter做接口测试&#xff0c;频繁遇到了文件上传的接口&#xff0c;与其他一般接口的处理方式不一样&#xff0c;想着分享下&#xff0c;希望能给测试同学一点启发。 文章将围绕三个部分进行展开&#xff1a; 一、用户场景 二、接口请求参数 三、JMeter脚本编写步骤…

数字孪生相关政策梳理--数字孪生整体规划(可下载)

自2021年国家“十四五”规划纲要提出“探索建设数字孪生城市”以来&#xff0c;国家发展和改革委员会、工业和信息化部、住房和城乡建设部、水利部、农业农村部等部门纷纷出台政策&#xff0c;大力推动数字孪生在千行百业的落地发展。这些政策不仅为数字孪生的应用提供了广阔的…

期权策略篇: 实现买方狂欢,让卖方稳赚不赔的策略

欢迎来到期权策略篇: 实现买方狂欢&#xff0c;让卖方稳赚不赔的策略&#xff0c;今天给大家带来的期权策略比较简单&#xff0c;是我们比较常见的四种单腿期权策略&#xff0c;这四种策略分别是买入看涨期权、买入看跌期权、卖出看涨期权、卖出看跌期权策略。本文来自&#xf…

C. Binary Strings are Fun

Problem - C - Codeforces 思路&#xff1a;我们发现如果sisi-1&#xff0c;那么假设为00&#xff0c;用f[i-1]表示si-1能够组成的合法的个数&#xff0c;那么si-1扩展的字符串中至少会有i-1个0&#xff0c;那么si有两种放法&#xff0c;1种是放一个1&#xff0c;一种是放一个0…

python文件(概念、基本操作、常用操作、文本文件的编码方式)

嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 &#x1f447; &#x1f447; &#x1f447; 更多精彩机密、教程&#xff0c;尽在下方&#xff0c;赶紧点击了解吧~ python源码、视频教程、插件安装教程、资料我都准备好了&#xff0c;直接在文末名片自取就可 1. 文件的概念…

python装13的一些写法

一些当你离职后&#xff0c;让老板觉拍大腿的代码 1. any(** in ** for ** in **) 判断某个集合元素&#xff0c;是否包含某个/某些元素 代码&#xff1a; if __name__ __main__:# 判断 list1 中是否包含某个/某些元素list1 [1,2,3,4]a any(x in [5,4] for x in list1) 输…

深拷贝与浅拷贝,就是这么简单

目录 1.拷贝的概念2.浅拷贝2.1. 浅拷贝的定义2.2. 浅拷贝的实现方式2.3 在内存中&#xff1a; 3. 深拷贝3.1. 深拷贝的定义3.2. 深拷贝的实现方式3.3 在内存中 4. 深拷贝与浅拷贝的区别5. 原型模式与深浅拷贝的关系6. 总结 1.拷贝的概念 在编程中&#xff0c;拷贝&#xff08;或…

循环神经网络--01 序列模型

生成数据 import torch from torch import nn from d2l import torch as d2lT 1000 time torch.arange(1,T1,dtypetorch.float32) x torch.sin(0.01*time)torch.normal(0,0.2,(T,)) d2l.plot(time,x,time,xlim[1,1000],figsize(6,3))将序列转换为特征-标签对&#xff08;fe…