LeetCode——二叉树篇(六)

news2024/11/16 5:47:50

 刷题顺序及思路来源于代码随想录,网站地址:https://programmercarl.com 

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

给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。

 

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

/**
 * @author light
 * @Description 从中序与后序遍历序列构造二叉树
 *
 * 给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历,
 * postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。
 * @create 2023-08-20 9:48
 */
public class BuildTreeTest {
	public static void main(String[] args) {
		Scanner input=new Scanner(System.in);
		int n=input.nextInt();
		int[] inorder=new int[n];
		for (int i = 0; i < n; i++) {
			inorder[i]=input.nextInt();
		}
		int[] postorder=new int[n];
		for (int i = 0; i < n; i++) {
			postorder[i]=input.nextInt();
		}
		TreeNode treeNode = buildTree(inorder, postorder);
		System.out.println(LevelOrderTest.levelOrder(treeNode)); //层序遍历输出二叉树
	}
	public static Map<Integer,Integer> map;
	public static TreeNode buildTree(int[] inorder, int[] postorder) {
		map=new HashMap<>();
		if(postorder.length==0||inorder.length==0){
			return null;
		}
		//用map中存放中序数组的值和下标: key--inorder[i];value--i
		for (int i = 0; i < inorder.length; i++) {
			map.put(inorder[i],i);
		}
		//左闭右闭
		return findNode(inorder,0,inorder.length-1,postorder,0,postorder.length-1);
	}

	private static TreeNode findNode(int[] inorder, int inBegin, int inEnd, int[] postorder, int postBegin, int postEnd) {
		if(inBegin>inEnd||postBegin>postEnd){
			return null;
		}

		int rootIndex=map.get(postorder[postEnd]); //找到后序数组最后一个元素在中序数组中的位置
		int rootValue=inorder[rootIndex]; //找到结点值
		TreeNode root=new TreeNode(rootValue); //构造节点

		//保存中序左子树个数,用于确定后序数组个数
		int lenOfLeft=rootIndex-inBegin;

		//中左序  后左序
		root.left=findNode(inorder,inBegin,rootIndex-1,postorder,postBegin,postBegin+lenOfLeft-1);
		//中右序  后右序
		root.right=findNode(inorder,rootIndex+1,inEnd,postorder,postBegin+lenOfLeft,postEnd-1);
		return root;

	}
}

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

给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

/**
 * @author light
 * @Description 从前序与中序遍历序列构造二叉树

 * @create 2023-08-20 11:00
 */
public class BuildTree2Test {
	public static void main(String[] args) {
		Scanner input=new Scanner(System.in);
		int n=input.nextInt();
		int[] preorder=new int[n];
		for (int i = 0; i < n; i++) {
			preorder[i]=input.nextInt();
		}
		int[] inorder=new int[n];
		for (int i = 0; i < n; i++) {
			inorder[i]=input.nextInt();
		}
		TreeNode treeNode=buildTree(preorder,inorder);
		System.out.println(LevelOrderTest.levelOrder(treeNode)); //层序遍历输出二叉树
	}

	public static Map<Integer,Integer> map;
	public static TreeNode buildTree(int[] preorder, int[] inorder) {
		if(preorder.length==0||inorder.length==0){
			return null;
		}
		map=new HashMap<>();
		//用map中存放中序数组的值和下标: key--inorder[i];value--i
		for (int i = 0; i < inorder.length; i++) {
			map.put(inorder[i],i);
		}

		//左闭右闭
		return findNode(preorder,0,preorder.length-1,inorder,0,inorder.length-1);

	}

	private static TreeNode findNode(int[] preorder, int preBegin, int preEnd, int[] inorder, int inBegin, int inEnd) {
		if(preBegin>preEnd||inBegin>inEnd){
			return null;
		}

		int rootIndex=map.get(preorder[preBegin]); //找到根节点在中序数组中的下标
		int rootValue=inorder[rootIndex];
		TreeNode root=new TreeNode(rootValue); //构造节点

		int lenOfLeft=rootIndex-inBegin; // 保存中序左子树个数,用来确定前序数列的个数

		//前左,中左
		root.left=findNode(preorder,preBegin+1,preBegin+lenOfLeft,inorder,inBegin,rootIndex-1);
		//前右,中由
		root.right=findNode(preorder,preBegin+lenOfLeft+1,preEnd,inorder,rootIndex+1,inEnd);



		return root;
	}

}

654. 最大二叉树

给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建:

  1. 创建一个根节点,其值为 nums 中的最大值。
  2. 递归地在最大值 左边 的 子数组前缀上 构建左子树。
  3. 递归地在最大值 右边 的 子数组后缀上 构建右子树。

返回 nums 构建的 最大二叉树 

输入:nums = [3,2,1,6,0,5]
输出:[6,3,5,null,2,0,null,null,1]
解释:递归调用如下所示:
- [3,2,1,6,0,5] 中的最大值是 6 ,左边部分是 [3,2,1] ,右边部分是 [0,5] 。
    - [3,2,1] 中的最大值是 3 ,左边部分是 [] ,右边部分是 [2,1] 。
        - 空数组,无子节点。
        - [2,1] 中的最大值是 2 ,左边部分是 [] ,右边部分是 [1] 。
            - 空数组,无子节点。
            - 只有一个元素,所以子节点是一个值为 1 的节点。
    - [0,5] 中的最大值是 5 ,左边部分是 [0] ,右边部分是 [] 。
        - 只有一个元素,所以子节点是一个值为 0 的节点。
        - 空数组,无子节点。
import java.util.Scanner;

/**
 * @author light
 * @Description 最大二叉树
 * @create 2023-08-21 13:54
 */
public class ConstructMaximumBinaryTreeTest {
	public static void main(String[] args) {
		Scanner input=new Scanner(System.in);
		int n=input.nextInt();
		int[] nums=new int[n];
		for (int i = 0; i < n; i++) {
			nums[i]=input.nextInt();
		}
		TreeNode treeNode = constructMaximumBinaryTree(nums);
		System.out.println(LevelOrderTest.levelOrder(treeNode)); //层序遍历输出二叉树
	}
	public static TreeNode constructMaximumBinaryTree(int[] nums) {
		if(nums.length==1){
			return new TreeNode(nums[0]);
		}
		//左闭右闭
		return findNode(nums,0, nums.length-1);
	}

	private static TreeNode findNode(int[] nums, int begin, int end) {
		//递归终止条件
		if(begin>end){
			return null;
		}
		//数组中只有一个元素
		if(end-begin==0){
			return new TreeNode(nums[begin]);
		}

		int rootIndex=Integer.MIN_VALUE;
		int rootValue=Integer.MIN_VALUE;
		for (int i = begin; i <=end; i++) {
			if(nums[i]>rootValue){
				rootValue=nums[i]; //找到最大的根节点值
				rootIndex=i;
			}
		}
		TreeNode root=new TreeNode(rootValue);


		root.left=findNode(nums,begin,rootIndex-1);

		root.right=findNode(nums,rootIndex+1,end);

		return root;

	}
}

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

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

相关文章

【PCIE体系结构十七】PCIE电源管理之PCI-PM

&#x1f449;个人主页&#xff1a;highman110 &#x1f449;作者简介&#xff1a;一名硬件工程师&#xff0c;持续学习&#xff0c;不断记录&#xff0c;保持思考&#xff0c;输出干货内容 参考书籍&#xff1a;《PCI.EXPRESS系统体系结构标准教材 Mindshare》 目录 设…

14. 利用Canvas自制时钟组件

1. 说明 在自定义时钟组件时&#xff0c;使用到的基本控件主要是Canvas&#xff0c;在绘制相关元素时有两种方式&#xff1a;一种时在同一个canvas中绘制所有的部件元素&#xff0c;这样需要不断的对画笔和画布的属性进行保存和恢复&#xff0c;容易混乱&#xff1b;另一种就是…

【C++】做一个飞机空战小游戏(十二)——游戏源代码、音效、图标等资源文件

[导读]本系列博文内容链接如下&#xff1a; 【C】做一个飞机空战小游戏(一)——使用getch()函数获得键盘码值 【C】做一个飞机空战小游戏(二)——利用getch()函数实现键盘控制单个字符移动【C】做一个飞机空战小游戏(三)——getch()函数控制任意造型飞机图标移动 【C】做一个飞…

基于微信小程序的短文作文写作竞赛管理系统

随着世界经济信息化、全球网络化的到来推动信息线上管理的飞速发展&#xff0c;为短文写作竞赛行业的改革起到关键作用。若想达到安全&#xff0c;快捷的目的&#xff0c;就需要拥有信息化的组织和管理模式&#xff0c;建立一套合理、畅通、高效的短文写作竞赛管理系统小程序。…

js中的正则表达式(一)

目录 1.什么是正则表达式 2.正则表达式在JavaScript中的使用场景: 3.正则表达式的语法&#xff1a; 1.什么是正则表达式 正则表达式(Regular Expression&#xff09;是用于匹配字符串中字符组合的模式。在JavaScript中&#xff0c;正则表达式也是对象通常用来查找、替换那些符…

亚马逊搜索关键词下单怎么操作

亚马逊鲲鹏系统可以根据产品关键词搜索后进行下单购买&#xff0c;多个亚马逊买家号搜索关键词下单可以帮助关键词上首页&#xff0c;具体操作如下&#xff1a; 首先需要先准备好一批能下单的买家账号及代理ip&#xff0c;准备好之后就可以设置需要下单的关键词及asin进行货比…

由于找不到concrt140.dll,无法继续执行代码怎么办

今天我想和大家分享一下我在修复concrt140.dll文件过程中的经验。作为一名程序员&#xff0c;我们经常会遇到各种各样的问题&#xff0c;而这次我所遇到的这个问题对我来说是一个挑战。在经过一番努力之后&#xff0c;我终于找到了解决方法&#xff0c;并且成功地修复了concrt1…

Markdown 基本语法

风无痕 August 21,2023 总览 几乎所有 Markdown 应用程序都支持 John Gruber 原始设计文档中列出的 Markdown 基本语法。但是&#xff0c;Markdown 处理程序之间存在着细微的变化和差异&#xff0c;我们都会尽可能标记出来。 标题&#xff08;Headings&#xff09; 要创建标…

信息安全/网络安全专业好不好?

​本人信息安全专业毕业&#xff0c;在甲方互联网大厂安全部与安全乙方大厂都工作过&#xff0c;有一些经验可以供对安全行业感兴趣的人参考。 或许是因为韩商言让更多人知道了CTF&#xff0c;也或许是因为网络安全越来越受国家重视&#xff0c;安全最近愈加火爆了。当然&…

司徒理财:8.21黄金空头呈阶梯下移!今日操作策略

黄金走势分析 盘面裸k分析&#xff1a;1小时周期的行情局部于1896附近即下行通道上轨附近录得一系列的K线呈震荡下行并筑圆顶&#xff0c;上轨压制有效&#xff0c;下行通道并未突破&#xff0c;后市建议延续看下行。4小时周期局部录得一系列的纺锤线呈震荡&#xff0c;但行情整…

ppt怎么做流程图?一文详解如何在ppt上绘制流程图!

ppt怎么做流程图&#xff1f;ppt制作流程图的方法是什么&#xff1f;本文将介绍2个在PPT中做流程图的方法&#xff0c;一起往下看吧。 方法一&#xff1a;利用PowerPoint自带功能 &#xff08;1&#xff09;使用SmartArt功能制作流程图 打开Microsoft PowerPoint并新建一…

测试Qt是否安装成功

1.打开Qt软件 选择新建项目,new 选择基类时&#xff0c;一次使用选择QWigget空白窗口&#xff0c;还有2种&#xff0c;带菜单栏的窗口和对话框窗口。选中Generate form会生成图形界面&#xff0c;组件直接拖拉&#xff0c;不需要自己编写。 运行结果&#xff1a;

【ICCV2023】Adaptive Frequency Filters As Efficient Global Token Mixers

Adaptive Frequency Filters As Efficient Global Token Mixers 论文&#xff1a;https://arxiv.org/abs/2307.14008 代码&#xff1a;暂未开源 解读&#xff1a;ICCV23&#xff5c;轻量级视觉主干网络AFFNet&#xff1a;频域自适应频段过滤空域全局动态大卷积核 - 知乎 (zh…

热烈祝贺贵州董程酿酒成功入选航天系统采购供应商库

经过航天系统采购平台的严审&#xff0c;贵州董程酿酒有限公司成功入选中国航天系统采购供应商库。航天系统采购平台是航天系统内企业采购专用平台&#xff0c;服务航天全球范围千亿采购需求&#xff0c;目前&#xff0c;已有华为、三一重工、格力电器、科大讯飞等企业、机构加…

基于讯飞开放平台API服务构建集成大模型能力

在前面的一篇文章中实测体验了讯飞开放平台发布的V2.0版本大模型的能力&#xff0c;感兴趣的话可以自行移步阅读即可&#xff1a; 《科大讯飞发布星火认知大模型2.0版——体验实测》 这里一并发布的还有API接口&#xff0c;如下所示&#xff1a; 点击【API测试申请】即可自动…

PHP服饰文化网站系统Dreamweaver开发mysql数据库web结构php编程计算机网页项目

一、源码特点 PHP 服饰文化网站系统是一套完善的web设计系统&#xff0c;对理解php编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 源码下载 https://download.csdn.net/download/qq_41221322/88236778 PHP服饰文化网站…

【哈希表】HashSet HashMap LeetCode习题

目录 136.只出现一次的数字 137.只出现一次的数字 || 217.存在重复元素 219.存在重复元素 || 771.宝石与石头 旧键盘(牛客) 首先需要导包 import java.utli.*; 表中常用的是前两个&#xff0c;时间复杂度低。O(1) Set<E> set new HashSet<>(); set.conta…

使用VSCode配置简单的vue项目

由于最近要使用的项目框架为前后端分离的&#xff0c;采用的是vue.jswebAPI的形式进行开发的。因为之前我没有接触过vue.js&#xff0c;也只是通过视频文档做了一些简单的练习。今天技术主管说让大家熟悉下VSCode开发vue&#xff0c;所以自己摸索了好久&#xff0c;才算是把简单…

2023年7月京东扫地机器人行业品牌销售排行榜(京东数据产品)

伴随消费者解放双手的消费需求&#xff0c;我国清洁电器行业快速发展。且随着消费回暖&#xff0c;我国扫地机器人市场也开始慢慢走出寒冬&#xff0c;止跌回升。 根据鲸参谋电商数据分析平台的相关数据显示&#xff0c;今年7月份&#xff0c;京东平台扫地机器人的销量为16万&…

正中优配:港股迎来估值“黄金坑” 哪个点位介入胜率高?

近两周&#xff0c;港股向下突破了一切技能短线支撑信号。在新的技能信号构成前&#xff0c;港股有望迎来估值压力的开释&#xff0c;带来一个估值“黄金坑”。当估值回到“轻视”区间时&#xff0c;咱们信任港股对全球资本的吸引力将再次凸显。详细而言&#xff0c;咱们用两种…