Leetcoder Day17| 二叉树 part06

news2024/9/22 7:33:38

语言:Java/C++ 

654.最大二叉树

给定一个不含重复元素的整数数组。一个以此数组构建的最大二叉树定义如下:

  • 二叉树的根是数组中的最大元素。
  • 左子树是通过数组中最大值左边部分构造出的最大二叉树。
  • 右子树是通过数组中最大值右边部分构造出的最大二叉树。

通过给定的数组构建最大二叉树,并且输出这个树的根节点。

示例 :

题目中说了输入的数组大小一定是大于等于1的,所以我们不用考虑小于1的情况,那么当递归遍历的时候,如果传入的数组大小为1,说明遍历到了叶子节点了。那么应该定义一个新的节点,并把这个数组的数值赋给新的节点,然后返回这个节点。

随后找当前整个数组的最大值,根据最大值的下标将数组分为左子树和右子树,继续递归进行构建。

class Solution {
    TreeNode traversal(int[] nums, int left, int right){
        if(right <= left ) return null;  //判空
        if(right-left==1){ //判断是否为一个节点,左闭右开
            return new TreeNode(nums[left]);
        }
        int maxIdx=left;
        int maxValue=nums[left];
        for(int i=left+1;i<right;i++){
            if(nums[i]>maxValue){
                maxValue=nums[i];
                maxIdx=i;
            }
        }
        TreeNode node = new TreeNode(maxValue);
        node.left=traversal(nums, left, maxIdx);
        node.right=traversal(nums, maxIdx+1, right);
        return node;
    }
    public TreeNode constructMaximumBinaryTree(int[] nums) {
        return traversal(nums, 0, nums.length);
    }   
}

617.合并二叉树 617.合并二叉树 

给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。

你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节点将直接作为新二叉树的节点。

这道题我的第一个想法是建立一个哈希表,层次遍历并存储第一个树的位置和值,如果该位置没有节点则为-1,随后创建新的节点,遍历第二个树,若当前位置已经有节点,则将两个节点值相加返回;如果第二棵树没有节点,但第一棵树有,则直接返回第一棵树的值;如果第一棵树没有节点,则直接返回第二棵树的值;若第二棵树的节点数少于第一棵树,则在遍历完第二棵树后直接将第一棵树的剩余节点返回。但是这个思路无疑增加了很多复杂性,其实遍历两棵树和遍历一棵树的思路是一样的,采用前序遍历即可。

class Solution {
    public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {
        if(root1==null && root2!=null) return root2; 
        if(root2==null && root1!=null) return root1; 
        if (root1 == null && root2 == null) return null;
        TreeNode root=new TreeNode(root1.val+root2.val);
        root.left=mergeTrees(root1.left,root2.left);
        root.right=mergeTrees(root1.right, root2.right);
        return root;
    }
}

700.二叉搜索树中的搜索

给定二叉搜索树(BST)的根节点和一个值。 你需要在BST中找到节点值等于给定值的节点。 返回以该节点为根的子树。 如果节点不存在,则返回 NULL。

例如,

因为本文的题设是二叉搜索树,所以这题就相对好办了,二叉搜索树是有序树:

  • 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
  • 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
  • 它的左、右子树也分别为二叉搜索树

因此,找到值等于val的点然后递归返回从这个点以后的树即可:

class Solution {
    TreeNode traversal(TreeNode root, int val){
        if(root==null||root.val==val) return root;
        if(root.val>val){
            return traversal(root.left, val);
        }
        else{
            return traversal(root.right, val);
        }
    }
    public TreeNode searchBST(TreeNode root, int val) {
        return traversal(root, val);

    }
}

98.验证二叉搜索树

给定一个二叉树,判断其是否是一个有效的二叉搜索树。

假设一个二叉搜索树具有如下特征:

  • 节点的左子树只包含小于当前节点的数。
  • 节点的右子树只包含大于当前节点的数。
  • 所有左子树和右子树自身必须也是二叉搜索树。

考研时数据结构里有一个结论:中序遍历下,输出的二叉搜索树节点的数值是有序序列,因此可以先将树转换为列表或数组,再判断是否有序即可。注意在Java中,如果将树转换为列表List,则需要用.get和size()来获取列表的值和长度,如果是数组,因为不知道树的节点个数,所以需要先设置一个很大的值,所以也可以先将树转换为列表,再将列表转换为数组。

class Solution {
    public void traversal(TreeNode root, List<Integer> vec){
        if(root==null) return;
        traversal(root.left, vec);
        vec.add(root.val);
        traversal(root.right, vec);
    }

    public boolean isValidBST(TreeNode root) {
        List<Integer> res=new ArrayList<Integer>();
        traversal(root, res); 
        // 将列表转换为数组
        Integer[] arr=res.toArray(new Integer[res.size()]);  
        for(int i=1; i<arr.length;i++){
            if(arr[i]<=arr[i-1]) {
                return false; 
            }
        }
        return true;
    }
}

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

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

相关文章

petalinux_zynq7 驱动DAC以及ADC模块之六:qt显示adc波形

前文&#xff1a; petalinux_zynq7 C语言驱动DAC以及ADC模块之一&#xff1a;建立IPhttps://blog.csdn.net/qq_27158179/article/details/136234296petalinux_zynq7 C语言驱动DAC以及ADC模块之二&#xff1a;petalinuxhttps://blog.csdn.net/qq_27158179/article/details/1362…

C# .Net 发布后,把dll全部放在一个文件夹中,让软件目录更整洁

PublishFolderCleaner – Github 测试环境: .Net 8 Program.cs 代码 // https://github.com/dotnet-campus/dotnetcampus.DotNETBuildSDK/tree/master/PublishFolderCleanerusing System.Diagnostics; using System.Text;// 名称, 不用写 .exe var exeName "AbpDemo&…

.Net8.0 WebApi 发布到 IIS 详细步骤

.NET 8 是微软于2021年8月24日宣布的下一代编程语言和框架&#xff0c;它是 .NET 的一部分&#xff0c;与 C# (Common Language Infrastructure) 紧密集成。.NET 8 引入了许多新功能&#xff0c;如原生编译、值类型 (Value Types)、结构化并发 (structured concurrency) 和快速…

Window部署Exceptionless

Exceptionless Elasticsearch 版本&#xff1a; Exceptionless&#xff1a;8.1.0 Elasticsearch&#xff1a;7.17.5 JDK&#xff1a;11.0.10 目录 一、Elasticsearch运行 二、 Exceptionless 一、Elasticsearch运行 bin目录下elasticsearch.bat 直接运行 访问 http://lo…

【AIGC】基于深度学习的图像生成与增强技术

摘要&#xff1a; 本论文探讨基于深度学习的图像生成与增强技术在图像处理和计算机视觉领域的应用。我们综合分析了主流的深度学习模型&#xff0c;特别是生成对抗网络&#xff08;GAN&#xff09;和变分自编码器&#xff08;VAE&#xff09;等&#xff0c;并就它们在实际应用中…

Python Web开发记录 Day2:CSS

名人说&#xff1a;莫道桑榆晚&#xff0c;为霞尚满天。——刘禹锡&#xff08;刘梦得&#xff0c;诗豪&#xff09; 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 二、CSS1、CSS-初始入门①快速了解②CSS应用方式…

(3)llvm ir转换过程

&#xff08;1&#xff09;DAG Lowering 输入的IR转换成SelectionDAG的过程被称作lowering 就是把llvm ir转成这种 &#xff08;2&#xff09;DAG legalization "DAG legalization"&#xff08;有向无环图合法化&#xff09;是编译器后端&#xff0c;特别是在LLVM中…

React18源码: reconciler执行流程

reconciler执行流程 1 &#xff09;概述 此处先归纳一下react-reconciler包的主要作用&#xff0c;将主要功能分为4个方面&#xff1a; 输入&#xff1a;暴露api函数&#xff08;如&#xff1a;scheduleUpdateOnFiber&#xff09;, 供给其他包&#xff08;如react包&#xff0…

《数字通信世界》杂志社数字通信世界杂志社2024年第1期目录

技术研究 基于B/S架构的海量空间数据并行上传方法研究 刘春伟; 1-348 城市轨道交通工程建设安全数据融合路径及方法 刘魁刚;张瑜;毕鹏;赵智涛;王春勇; 4-6 信息化背景下智慧社区的建设研究 崔宏尧;刘敏智;于志宏;李杰;殷秀莉; 7-9 基于数字孪生技术的工业机器人…

通俗易懂理解G-GhostNet轻量级神经网络模型

一、参考资料 原始论文&#xff1a;[1] IJCV22 | 已开源 | 华为GhostNet再升级&#xff0c;全系列硬件上最优极简AI网络 二、G-GhostNet相关介绍 G-GhostNet 又称为 GhostNetV1 的升级版&#xff0c;是针对GPU优化的轻量级神经网络。 1. 摘要 GhostNetV1 作为近年来最流行…

力扣随笔之通过删除字母匹配到字典里最长单词(中等524)

思路&#xff1a;根据题意有两个问题待解决 1、s字符串中是否可以通过删减得到该英语词语 2、如何找到长度最长且字母序最小的字符串 针对第二个问题可以对词典dictionary进行预处理&#xff1a;根据长度降序和字母序升序来排序 针对第一个问题可以初始化两个指针i&#xff0c;…

Leetcode日记 889. 根据前序和后序遍历构造二叉树

Leetcode日记 889. 根据前序和后序遍历构造二叉树 给定两个整数数组&#xff0c;preorder 和 postorder &#xff0c;其中 preorder 是一个具有 无重复 值的二叉树的前序遍历&#xff0c;postorder 是同一棵树的后序遍历&#xff0c;重构并返回二叉树。 如果存在多个答案&#…

设计模式之委派模式

文章目录 前言正文一、生活中的例子二、Java代码实现2.1 类设计2.2 代码实现2.2.1 Employee2.2.2 ArchitectureDesignEmployer2.2.3 BackEmployer2.2.4 FrontEmployer2.2.5 Leader2.2.6 EmployeeStrongPointEnum2.2.7 Boss 2.3 测试2.3.1 Client2.3.2 测试结果 三、委派模式的优…

Hackme 1

信息收集 Nmap部分 存活扫描&#xff1a; └─# nmap -sn 192.168.10.1/24 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-02-20 15:00 CST Nmap scan report for 192.168.10.1 (192.168.10.1) Host is up (0.00012s latency). MAC Address: 00:50:56:C0:00:08 (VMwar…

【vue js】将数组元素,按照2个一组,重组为2维数组

实现效果&#xff1a; 要实现上述&#xff0c;2张图片为一个走马灯的内容&#xff0c;而后端传回的数据是一个数组。我采用的是将数据重组为2维数组的方法。 因为没有强制要求展示顺序&#xff0c;我采用将首尾组合的方式组成一个数组元素&#xff1b; 首先判断原始数据长度的…

onnx 1.16 doc学习笔记四:python API-If和Scan

onnx作为一个通用格式&#xff0c;很少有中文教程&#xff0c;因此开一篇文章对onnx 1.16文档进行翻译与进一步解释&#xff0c; onnx 1.16官方文档&#xff1a;https://onnx.ai/onnx/intro/index.html](https://onnx.ai/onnx/intro/index.html)&#xff0c; 如果觉得有收获&am…

$attrs

一、概念 vue官网定义如下: 包含了父作用域中不作为 prop 被识别 (且获取) 的 attribute 绑定 (class 和 style 除外)。当一个组件没有声明任何 prop 时,这里会包含所有父作用域的绑定 (class 和 style 除外),并且可以通过v-bind="$attrs"传入内部组件——在创建…

【高德地图】Android高德地图控件交互详细介绍

&#x1f4d6;第5章 与地图控件交互 ✅控件交互&#x1f9ca;缩放按钮&#x1f9ca;指南针&#x1f9ca;定位按钮&#x1f9ca;地图Logo ✅手势交互&#x1f9ca;缩放手势&#x1f9ca;滑动手势&#x1f9ca;旋转手势&#x1f9ca;倾斜手势&#x1f9ca;指定屏幕中心点的手势操…

无线传感器网络简单介绍

&#xff08;本文为简单介绍&#xff0c;内容来源自网络&#xff09; 无线传感器网络&#xff08;Wireless Sensor Networks&#xff09;是一种创新的传感器网络架构&#xff0c;具有广泛的应用前景和潜力。与传统的有限传感器网络不同&#xff0c;无线传感器网络克服了节点数…