当前位置: 首页 > news >正文

【剑指offer】重建二叉树

在这里插入图片描述

  • 👑专栏内容:力扣刷题
  • ⛪个人主页:子夜的星的主页
  • 💕座右铭:前路未远,步履不停

目录

  • 一、题目描述
    • 1、题目
    • 2、示例
  • 二、题目分析
    • 1、递归
    • 2、栈


一、题目描述

1、题目

剑指offer:重建二叉树

给定节点数为 n 的二叉树的前序遍历和中序遍历结果,请重建出该二叉树并返回它的头结点。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建出如下图所示。
在这里插入图片描述

提示:
1.vin.length == pre.length
2.previn 均无重复元素
3.vin出现的元素均出现在 pre里
4.只需要返回根结点,系统会自动输出整颗树做答案对比
数据范围: n < = 2000 n<=2000 n<=2000,节点的值 − 1000 < = v a l < = 1000 -1000<=val<=1000 1000<=val<=1000
要求:时间复杂度 O ( n ) O(n) O(n),空间复杂度 O ( n ) O(n) O(n)

2、示例

示例1

输入:[1,2,4,7,3,5,6,8],[4,7,2,1,5,3,8,6]
返回值:{1,2,3,4,#,5,6,#,7,#,#,8}
说明:返回根节点,系统会输出整颗二叉树对比结果,重建结果如题面图示    

示例2

输入:[1],[1]
返回值:{1}

示例3

输入:[1,2,3,4,5,6,7],[3,2,4,1,6,5,7]
返回值:{1,2,5,3,4,6,7}

二、题目分析

1、递归

public class Solution {public TreeNode reConstructBinaryTree(int [] pre,int [] vin) {int n = pre.length;int m = vin.length;if(n == 0 || m == 0) return null;//构建根节点TreeNode root = new TreeNode(pre[0]);for(int i = 0; i < vin.length; i++){//找到中序遍历中的前序第一个元素if(pre[0] == vin[i]){ //构建左子树root.left = reConstructBinaryTree(Arrays.copyOfRange(pre, 1, i + 1), Arrays.copyOfRange(vin, 0, i)); //构建右子树root.right = reConstructBinaryTree(Arrays.copyOfRange(pre, i + 1, pre.length), Arrays.copyOfRange(vin, i + 1, vin.length));break;}}return root;}
}

2、栈

请添加图片描述

public class Solution {public TreeNode reConstructBinaryTree(int [] pre,int [] vin) {int n = pre.length;int m = vin.length;//每个遍历都不能为0if(n == 0 || m == 0) return null;Stack<TreeNode> s = new Stack<TreeNode>();//首先建立前序第一个即根节点TreeNode root = new TreeNode(pre[0]); TreeNode cur = root;for(int i = 1, j = 0; i < n; i++){//要么旁边这个是它的左节点if(cur.val != vin[j]){ cur.left = new TreeNode(pre[i]);s.push(cur);//要么旁边这个是它的右节点,或者祖先的右节点cur = cur.left; }else{j++;//弹出到符合的祖先while(!s.isEmpty() && s.peek().val == vin[j]){cur = s.pop();j++;}//添加右节点cur.right = new TreeNode(pre[i]); cur = cur.right;}}return root;}
}
http://www.lryc.cn/news/286710.html

相关文章:

  • 中仕教育:事业编招考全流程介绍
  • 149. 直线上最多的点数
  • 不合格机器人工程讲师再读《悉达多》-2024-
  • 【STM32CubeMX串口通信详解】USART2 -- DMA发送 + DMA空闲中断 接收不定长数据
  • Webpack5入门到原理19:React 脚手架搭建
  • 苹果眼镜(Vision Pro)的开发者指南(6)-实战应用场景开发 - 游戏、协作、空间音频、WebXR
  • flutter底层架构初探
  • 初识SQL注入
  • React初探:从环境搭建到Hooks应用全解析
  • 设计模式——1_6 代理(Proxy)
  • 性能优化(CPU优化技术)-NEON 介绍
  • Kafka-服务端-KafkaController
  • ffmpeg使用手册
  • 操作系统导论-课后作业-ch15
  • 宝塔面板SRS音视频TRC服务器启动失败
  • 04-Seata修改通信端口
  • 活动回顾丨云原生技术实践营上海站「云原生 AI 大数据」专场(附 PPT)
  • 【数据结构与算法】4.自主实现单链表的增删查改
  • Linux系统常用命令行指令
  • java SSM园林绿化管理系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计
  • 【issue-halcon例程学习】edges_color.hdev
  • 设计模式—行为型模式之备忘录模式
  • CMS如何调优
  • 在PyCharm中安装GitHub Copilot插件,login之后报出如下错误:
  • L1-093 猜帽子游戏(Java)
  • JVM篇--JVM调优高频面试题
  • 微软 AD 介绍 | 安全建议 | 防护
  • React16源码: React中的reconcileChildren的源码实现
  • 幻兽帕鲁Docker服务端搭建
  • 【ARM Cortex-M 系列 1.1 -- Cortex-M33 与 M4 差异 详细介绍】