2024.2.21力扣每日一题——从中序和后序遍历序列构建二叉树

2024-04-02 05:12

本文主要是介绍2024.2.21力扣每日一题——从中序和后序遍历序列构建二叉树,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

2024.2.21

      • 题目来源
      • 我的题解
        • 方法一 递归方式
        • 方法二 迭代方式

题目来源

力扣每日一题;题序:106

我的题解

方法一 递归方式
  • 后序特点:[ [左子树的前序遍历结果], [右子树的前序遍历结果],根节点 ]
  • 中序特点:[ [左子树的中序遍历结果], 根节点, [右子树的中序遍历结果] ]
    发现后序遍历的数组最后一个元素代表的即为根节点。知道这个性质后,我们可以利用已知的根节点信息在中序遍历的数组中找到根节点所在的下标,然后根据其将中序遍历的数组分成左右两部分,左边部分即左子树,右边部分为右子树,针对每个部分可以用同样的方法继续递归下去构造。
    时间复杂度:O( n 2 n^2 n2)
    空间复杂度:O(n)
public TreeNode buildTree(int[] inorder, int[] postorder) {return createTree(inorder,postorder,0,inorder.length-1,0,postorder.length-1);
}
public TreeNode createTree(int[] inorder, int[] postorder,int iL,int iR,int pL,int mid){if(iL>iR||pL>mid)return null;int val=postorder[mid];TreeNode root=new TreeNode(val);int index=find(inorder,val,iL,iR);int left=index-iL;int right=iR-index;root.left=createTree(inorder,postorder,iL,index-1,pL,mid-right-1);root.right=createTree(inorder,postorder,index+1,iR,mid-right,mid-1);return root;
}public int find(int[] inorder,int val,int iL,int iR){int index=iL;for(int i=iL;i<=iR;i++){if(inorder[i]==val){index=i;}}return index;
}

在中序遍历中对根节点进行定位时,需要频繁扫描整个中序遍历的结果并找出根节点,时间复杂度较高。可以考虑使用哈希表来帮助快速地定位根节点。在此后构造二叉树的过程中,就只需要 O(1)的时间对根节点进行定位了。

//使用哈希表优化
public TreeNode buildTree(int[] inorder, int[] postorder) {Map<Integer,Integer> map=new HashMap<>();for(int i=0;i<inorder.length;i++){map.put(inorder[i],i);}return createTree(inorder,postorder,0,inorder.length-1,0,postorder.length-1,map);
}
public TreeNode createTree(int[] inorder, int[] postorder,int iL,int iR,int pL,int mid,Map<Integer,Integer> map){if(iL>iR||pL>mid)return null;int val=postorder[mid];TreeNode root=new TreeNode(val);int index=map.get(val);int left=index-iL;int right=iR-index;root.left=createTree(inorder,postorder,iL,index-1,pL,mid-right-1,map);root.right=createTree(inorder,postorder,index+1,iR,mid-right,mid-1,map);return root;
}
方法二 迭代方式

看官方题解,我还没搞明白!!!!

有任何问题,欢迎评论区交流,欢迎评论区提供其它解题思路(代码),也可以点个赞支持一下作者哈😄~

这篇关于2024.2.21力扣每日一题——从中序和后序遍历序列构建二叉树的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

Retrieval-based-Voice-Conversion-WebUI模型构建指南

一、模型介绍 Retrieval-based-Voice-Conversion-WebUI(简称 RVC)模型是一个基于 VITS(Variational Inference with adversarial learning for end-to-end Text-to-Speech)的简单易用的语音转换框架。 具有以下特点 简单易用:RVC 模型通过简单易用的网页界面,使得用户无需深入了

uva 10131 最长子序列

题意: 给大象的体重和智商,求体重按从大到小,智商从高到低的最长子序列,并输出路径。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <stack>#include <vect

maven 编译构建可以执行的jar包

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」👈,「stormsha的知识库」👈持续学习,不断总结,共同进步,为了踏实,做好当下事儿~ 专栏导航 Python系列: Python面试题合集,剑指大厂Git系列: Git操作技巧GO

嵌入式Openharmony系统构建与启动详解

大家好,今天主要给大家分享一下,如何构建Openharmony子系统以及系统的启动过程分解。 第一:OpenHarmony系统构建      首先熟悉一下,构建系统是一种自动化处理工具的集合,通过将源代码文件进行一系列处理,最终生成和用户可以使用的目标文件。这里的目标文件包括静态链接库文件、动态链接库文件、可执行文件、脚本文件、配置文件等。      我们在编写hellowor

POJ1631最长单调递增子序列

最长单调递增子序列 import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintWriter;import java.math.BigInteger;import java.util.StringTokenizer;publ

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点

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

根据一棵树的前序遍历与中序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如,给出 前序遍历 preorder = [3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树: 3/ \9 20/ \15 7   class Solution {public TreeNode buildTree(int[] pr

【LabVIEW学习篇 - 21】:DLL与API的调用

文章目录 DLL与API调用DLLAPIDLL的调用 DLL与API调用 LabVIEW虽然已经足够强大,但不同的语言在不同领域都有着自己的优势,为了强强联合,LabVIEW提供了强大的外部程序接口能力,包括DLL、CIN(C语言接口)、ActiveX、.NET、MATLAB等等。通过DLL可以使用户很方便地调用C、C++、C#、VB等编程语言写的程序以及windows自带的大

每日一题|牛客竞赛|四舍五入|字符串+贪心+模拟

每日一题|四舍五入 四舍五入 心有猛虎,细嗅蔷薇。你好朋友,这里是锅巴的C\C++学习笔记,常言道,不积跬步无以至千里,希望有朝一日我们积累的滴水可以击穿顽石。 四舍五入 题目: 牛牛发明了一种新的四舍五入应用于整数,对个位四舍五入,规则如下 12345->12350 12399->12400 输入描述: 输入一个整数n(0<=n<=109 ) 输出描述: 输出一个整数