中序和前/后序遍历构造二叉树———通用做法

news2025/1/19 11:30:27

1. 前序和中序遍历

在这里插入图片描述

**思路:我们每一次一定可以根据递归确定根节点是哪个,就是前序第一个数,然后找中序遍历这个点,看左子树有几个节点,右子树有几个节点,然后就可以根据节点个数,递归左子树和右子树,当且仅当left>right时结束,由于preorder和inorder对应的所以left>right只需要判断一个符不符合就行了。**8个位置的判断一定要仔细。借助hashmap确定中序遍历某个节点的位置。

class Solution {
    Map<Integer,Integer> mp = new HashMap();
    int n;
    TreeNode PreMidTreeBuilder(int[] preorder,int[] inorder,
            int preorder_left, int preorder_right, int inorder_left, int inorder_right){
        if(preorder_left>preorder_right) return null;
        TreeNode root = new TreeNode(0,null,null);
        int rootNodeVal = preorder[preorder_left];
        root.val = rootNodeVal;
        //定位到中序遍历的位置
        int inorderRoot = mp.get(rootNodeVal);
        //可以根据坐标定下来左右子树的节点数量
        int leftLength = inorderRoot-inorder_left;
        int rightLength = inorder_right-inorderRoot;
        root.left=
            PreMidTreeBuilder(preorder,inorder,preorder_left+1,preorder_left+leftLength,
                            inorder_left,inorderRoot-1);    
        root.right=
            PreMidTreeBuilder(preorder,inorder,preorder_left+leftLength+1,preorder_right,
                            inorderRoot+1,inorder_right);
        return root;
    }
    public TreeNode buildTree(int[] preorder, int[] inorder) {
        n = preorder.length;
        for(int i=0;i<n;i++)
            mp.put(inorder[i],i);
        return PreMidTreeBuilder(preorder,inorder,0,n-1,0,n-1);
    }
}

2. 中序和后序遍历

和前序+中序完全一样的思路,可以说所有这种题都是这个思路。

class Solution { 
    Map<Integer,Integer> map = new HashMap<>();
    public TreeNode buildInPostTree(int[] inorder, int[] postorder,
                    int inorder_left,int inorder_right,int postorder_left,int postorder_right)
    {
        if(inorder_left>inorder_right)return null;
        int val = postorder[postorder_right];
        int inorder_root = map.get(val);
        int nums_left_tree = inorder_root-inorder_left;
        int nums_right_tree = inorder_right-inorder_root;
        TreeNode root = new TreeNode(val,null,null);
        root.left = buildInPostTree(inorder,postorder,inorder_left,inorder_left+nums_left_tree-1,
                                    postorder_left,postorder_left+nums_left_tree-1);
        root.right = buildInPostTree(inorder,postorder,inorder_root+1,inorder_right,
                                    postorder_right-nums_right_tree,postorder_right-1);
        return root; 
    }
    public TreeNode buildTree(int[] inorder, int[] postorder) {
        int n = inorder.length;
        for(int i=0;i<n;i++)
            map.put(inorder[i],i);
        return buildInPostTree(inorder,postorder,0,n-1,0,n-1);
    }
}

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

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

相关文章

分享66个焦点幻灯JS特效,总有一款适合您

分享66个焦点幻灯JS特效&#xff0c;总有一款适合您 66个焦点幻灯JS特效下载链接&#xff1a;https://pan.baidu.com/s/10bqe09IAZt_hbsZlXaxkxw?pwd6666 提取码&#xff1a;6666 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;…

搭建若依框架完成医疗项目 ——业务流程及页面展示

目录 一、搭建若依项目 1.1 快速了解 1.1.1 技术选型 1.1.2 内置功能 1.2 环境部署 二、医疗项目业务 2.1 门诊模块 2.2 住院模块 2.3 药房药库 2.4 表设计 三、项目展示 3.1 项目背景 3.2 门诊功能模块 3.2.1 患者档案 3.2.2 门诊卡信息 ​编辑 3.2.3 患者…

QueryRunner报红处理

如图&#xff0c;有同学反映QueryRunner报红&#xff0c;就是没有导包 自己去找项目的地址&#xff0c;找到web文件夹下的WEB-INF 把这些jar包都粘贴进去&#xff0c;以后项目基本都会用到的&#xff0c;资源自己去找 粘贴好后打开文件的Project Structure 点击Dependencies 点…

探索Java中的synchronized关键字

第1章&#xff1a;引言 咱们程序员在面对多线程编程时&#xff0c;经常会听到一个词——synchronized。这个词在Java世界里就像是一把万能钥匙&#xff0c;打开并发编程的大门。但是&#xff0c;你知道吗&#xff1f;虽然synchronized用得多&#xff0c;但真正深入理解它的人并…

solidity实现ERC721代币标准发布NFT

文章目录 1、非同质化货币&#xff08;NFT&#xff09;- 维基百科2、IERC1653、IERC7214、IERC721Receiver5、IERC721Metadata6、ERC7217、ERC721 NFT 的实现8、编译部署 1、非同质化货币&#xff08;NFT&#xff09;- 维基百科 非同质化代币&#xff08;英语&#xff1a;Non-F…

【滑动窗口】水果成篮

水果成篮 904. 水果成篮 - 力扣&#xff08;LeetCode&#xff09; 文章目录 水果成篮题目描述问题转化 算法原理解法一解法二 代码编写C代码&#xff1a;使用容器数组模拟哈希表 Java代码使用容器数组模拟哈希表 题目描述 你正在探访一家农场&#xff0c;农场从左到右种植了一…

Java 数据结构篇-用链表、数组实现队列(数组实现:循环队列)

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 队列的说明 1.1 队列的几种常用操作 2.0 使用链表实现队列说明 2.1 链表实现队列 2.2 链表实现队列 - 入栈操作 2.3 链表实现队列 - 出栈操作 2.4 链表实现队列 …

养身馆推拿会员管理系统,佳易王推拿会员管理软件短信设置教程

养身馆推拿会员管理系统&#xff0c;佳易王推拿会员管理软件短信设置教程 一、佳易王会员管理软件大众版 部分功能简介&#xff1a; 1、会员信息登记 &#xff1a;可以直接使用手机号登记&#xff0c;也可以使用实体卡片&#xff0c;推荐用手机号即可。 2、会员卡类型 &…

【每日一题】可获得的最大点数

文章目录 Tag题目来源题目解读解题思路方法一&#xff1a;滑动窗口方法二&#xff1a;前缀和 写在最后 Tag 【滑动窗口】【前缀和】【数组】【2023-12-03】 题目来源 1423. 可获得的最大点数 题目解读 在一排卡牌中拿出 k 张卡牌&#xff0c;每次必须从这一排卡牌的开头或者…

运维02:Linux

Linux安装 VMWare安装&#xff1a;夸克网盘分享&#xff08;提取码&#xff1a;refg&#xff09; CentOS安装&#xff1a;Index of /centos/7.9.2009/isos/x86_64/ Xshell安装&#xff1a;百度网盘 请输入提取码&#xff08;提取码&#xff1a;juau&#xff09; 环境准备 1、…

Pikachu(三)

RCE(remote command/code execute)概述 RCE漏洞&#xff0c;可以让攻击者直接向后台服务器远程注入操作系统命令或者代码&#xff0c;从而控制后台系统。 远程系统命令执行 一般出现这种漏洞&#xff0c;是因为应用系统从设计上需要给用户提供指定的远程命令操作的接口 比如我…

Cmkae外部依赖管理

文章目录 一、cmake依赖管理介绍二、源码依管理1. FetchContent与find_package进行集成 2. CPM3. git submodule附加&#xff1a; address_sanitizer 和 undefined sanitizer 一、cmake依赖管理介绍 CMake 是跨平台的构建系统&#xff0c;支持 C/C、Objective-C、Fortran 等多种…

C++基础 -36- 模板之模板函数

模板函数格式 template <class T> void allexchange(T a,T b) {T c;c*a;*a*b;*bc; }模板函数可以增强函数的通用性 举例说明&#xff0c;使用一个模板函数实现了两个的函数的功能 #include "iostream"using namespace std;void myexchangeint(int* a,int* …

Grafana部署与Zabbix集成,搭建开源IT监控平台

Grafana部署与Zabbix集成 目前在一家公司主要是网络、运维、IT支持&#xff0c;每次需要检查服务器状态都是需要手动登录系统进行查看&#xff0c;因此想着部署一套监控系统&#xff0c;功能上需要实现监控、可视化、告警等。由于预算没有&#xff0c;服务器资源倒是有空闲的&a…

【hacker送书活动第7期】Python网络爬虫入门到实战

第7期图书推荐 内容简介作者简介大咖推荐图书目录概述参与方式 内容简介 本书介绍了Python3网络爬虫的常见技术。首先介绍了网页的基础知识&#xff0c;然后介绍了urllib、Requests请求库以及XPath、Beautiful Soup等解析库&#xff0c;接着介绍了selenium对动态网站的爬取和S…

电容和电感

一、电感 1&#xff09;图片 2&#xff09;作用 a&#xff09;储存容量 例如dcdc转换器的原理,将一个电压值转换成另外一个电压值 b&#xff09;选择信号 比如空气中弥漫着很多信号&#xff0c;我们应该怎么选取我们所需要的信号。 电感和电容可以看成一个电阻&#xff0c;当电…

Redis ziplist源码解析

area |<---- ziplist header ---->|<----------- entries ------------->|<-end->|size 4 bytes 4 bytes 2 bytes ? ? ? ? 1 byte--------------------------------------------------------------- comp…

MySQL进阶部分

存储引擎 MySQL体系结构图&#xff1a; 连接层&#xff1a; 最上层是一些客户端连接服务&#xff0c;主要完成一些类似于连接处理 &#xff0c;授权认证及相关的安全方案。服务器也会为安全接入的每个用户端验证它所具有的操作权限。 服务层&#xff1a; 第二层架构主要完成大…

数据科学:Matplotlib、Seaborn笔记

数据科学&#xff1a;Numpy、Pandas、Matplotlib、Seaborn 三、Matplotlib1.Matplotlib subplots函数2.tight_layout()函数3.Matplotlib grid()设置网格格式4.fill_between()函数示例设置x轴为时间刻度热力图 四、Seaborn1.set2.seaborn.scatterplot 参考 数据科学&#xff1a;…

github打不开,全网最简单解决方法,没有之一

下载watt toolkit&#xff0c; 选择‘github’&#xff0c;点击‘一键加速’&#xff0c; 具体步骤如下&#xff1a;去电脑微软商店下载watt toolkit&#xff0c;或者直接打开网址https://apps.microsoft.com/detail/9MTCFHS560NG?hlen-us&glUS 如图&#xff0c;点击安装i…