力扣-根据前序和后序遍历构造二叉树(java)

news/2024/11/9 10:01:35/

根据前序和后序遍历构造二叉树

  • leetcode 889 题(中等)
  • 解题思路
  • 代码演示
  • 二叉树专题

leetcode 889 题(中等)

原题链接:
https://leetcode.cn/problems/construct-binary-tree-from-preorder-and-postorder-traversal/

题目描述:
给定两个整数数组,preorder 和 postorder ,其中 preorder 是一个具有 无重复 值的二叉树的前序遍历,postorder 是同一棵树的后序遍历,重构并返回二叉树。
如果存在多个答案,您可以返回其中 任何 一个。

示例1:
在这里插入图片描述
输入:preorder = [1,2,4,5,3,6,7], postorder = [4,5,2,6,7,3,1]
输出:[1,2,3,4,5,6,7]

示例2:
输入: preorder = [1], postorder = [1]
输出: [1]

提示:
1 <= preorder.length <= 30
1 <= preorder[i] <= preorder.length
preorder 中所有值都 不同
postorder.length == preorder.length
1 <= postorder[i] <= postorder.length
postorder 中所有值都 不同
保证 preorder 和 postorder 是同一棵二叉树的前序遍历和后序遍历

解题思路

preorder = [1,2,4,5,3,6,7],
postorder = [4,5,2,6,7,3,1]
前序遍历 头左右
后序遍历 左右头
根据遍历顺序 我们可以确定头节点,
然后在前序遍历中,头节点下一位置2 就是左节点起始位置,
通过2 可以在中序遍历中 找到左子树的结束位置
左树确定好了,就可以确定右树了。

代码演示

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {public TreeNode constructFromPrePost(int[] preorder, int[] postorder) {int right = preorder.length - 1;return process(preorder,0,right,postorder,0,right);}/*** pre 前序遍历数组* ps 前序遍历起始位置* pe 结束位置* pos  后序遍历数组* hs 后序的起始位置* he 后序的结束位置**/public TreeNode process(int[]pre,int ps,int pe,int[]pos,int hs,int he){//base case 处理越界if(ps > pe || hs > he){return null;}//base case 相等时直接返回。if(ps == pe){return  new TreeNode(pre[ps]);}//直接先拿到头节点TreeNode root = new TreeNode(pre[ps]);//前序遍历中头节点下一个节点是左节点,直接拿到值int leftVal = pre[ps+1];//记录左节点在后序遍历中的位置int index = 0;//根据值比较 确定位置for(int i = hs;i <= he;i++){if(pos[i] == leftVal){index = i;break;}}//计算出左子树的节点数int leftSize = index - hs + 1;//构造左子树root.left = process(pre,ps+1,ps+leftSize,pos,hs,hs+leftSize-1);//构造右子树root.right = process(pre,ps+leftSize+1,pe,pos,index+1,he-1);return root;}
}

二叉树专题

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

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

最大二叉树

二叉树的序列化和反序列化


http://www.ppmy.cn/news/142705.html

相关文章

微星 H670 Tomahawk 参数

英特尔最先推出了 Z690 芯片组主板系列&#xff0c;后来推出了 B660 和 H610 型号&#xff0c;但 H670 型号较少。微星新款 H670 Tomahawk 主板与 B660 Tomahawk 系列主板相比拥有更多的 I / O 和更宽的芯片组总线。H670 拥有 8 通道 DMI 4.0 芯片组总线&#xff0c;而 B660 则…

TP-LINK TL-WDN7200H ubuntu驱动安装

TP-LINK本身没有在中文网站提供linux驱动。 英文网站的网卡型号不一样&#xff0c;通过样子猜测是T9UH&#xff0c;于是google了一下发现有开源驱动。 具体做法如下&#xff1a; sudo apt-get update && sudo apt-get install git dkms git clone https://github.co…

msn邮箱在哪里登录?

MSN是微软公司旗下的门户网站&#xff0c;涵盖了我们生活的方方面面&#xff0c;沟通、社交、出行、娱乐等等。下面&#xff0c;我就给大家介绍一下MSN邮箱的登陆方法。如果你也想知道&#xff0c;就一起来详细了解下吧。 1、网页搜索MSN官网将其打开&#xff0c;如果你有账号&…

中兴N760不断重启解决办法

某天&#xff0c;中兴N760手机在开机界面处不断重启&#xff0c;上网搜索解决办法未果&#xff0c;后来在中兴官方网站上找到 “ N760 终端软件在线升级工具(中国电信)” http://www.ztedevice.com.cn/support/smart_phone/f1282608-d2cb-402b-bbde-a054e56e1926.html#typesof…

CentOS7安装 NVIDIA 驱动程序

文章目录 前言一、准备工作二、安装步骤1.安装步骤 总结 前言 随着人工智能的不断发展&#xff0c;机器学习这门技术也越来越重要&#xff0c;机器需要显卡&#xff0c;那么如何在centos服务器下安装显卡是本文的重点。 一、准备工作 下载显卡驱动程序 NVIDIA-Linux-x86_64-5…

centos7安装nvidia 显卡驱动

一、系统及显卡 系统&#xff1a;centos7.7 64位 显卡&#xff1a;gtx 1080ti 前几天主要是有一个人脸识别的项目测试&#xff0c;需要用到显卡去测试性能&#xff0c;然后装显卡的过程折腾了一下&#xff0c;特此记录。 回到顶部 二、安装过程 1. 下载驱动 从NVIDIA官网 …

centos7更新nvidia显卡驱动

安装&#xff1a; 一、系统及显卡 系统&#xff1a;centos7.3 64位 显卡&#xff1a;Tesla V100 二、安装过程 1. 下载驱动 从NVIDIA官网 https://www.geforce.cn/drivers 选择相应的驱动并下载&#xff0c;下载下来是.run文件。 2. 安装依赖 要装的三个依赖分别是&#…

CentOS 7 Nvidia 显卡驱动安装

网上充斥着各种各样的CentOS 7安装nvidia显卡的方法&#xff0c;无非是用blacklist来进行屏蔽&#xff0c;乍一看&#xff0c;好像是对的&#xff0c;但是试过后&#xff0c;发现blacklist都是能正常运行的&#xff0c;因此重新写一个来备份&#xff0c;主要参考以下文章 htt…