二叉树06(leetcode654,617,700,98)

embedded/2024/9/25 15:36:23/

参考资料:

https://programmercarl.com/0654.%E6%9C%80%E5%A4%A7%E4%BA%8C%E5%8F%89%E6%A0%91.html

654. 最大二叉树

题目描述:

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

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

返回 nums 构建的 最大二叉树 

示例 1:

输入: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 的节点。- 空数组,无子节点。

思路分析:

        关键:用下标切割二叉树

        区间规则统一,如都左闭右开

代码实现:

/*** 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 constructMaximumBinaryTree(int[] nums) {return constructHelp(nums,0,nums.length);}public TreeNode constructHelp(int[] nums,int left,int right){if(left>=right) return null;if(right-left==1) return new TreeNode(nums[left]);//找最大值 及 下标int maxValue=0;int maxIndex=0;for(int i=left;i<right;i++){if(nums[i]>maxValue){maxIndex=i;maxValue=nums[i];}}TreeNode node=new TreeNode(maxValue);//因为终止条件中判断了null的情况,所以这里不用if条件判断是否空了node.left=constructHelp(nums,left,maxIndex);node.right=constructHelp(nums,maxIndex+1,right);return node;}}

 617. 合并二叉树

题目描述:

给你两棵二叉树: root1 和 root2 。

想象一下,当你将其中一棵覆盖到另一棵之上时,两棵树上的一些节点将会重叠(而另一些不会)。你需要将这两棵树合并成一棵新二叉树。合并的规则是:如果两个节点重叠,那么将这两个节点的值相加作为合并后节点的新值;否则,不为 null 的节点将直接作为新二叉树的节点。

返回合并后的二叉树。

注意: 合并过程必须从两个树的根节点开始。

示例 1:

输入:root1 = [1,3,2,5], root2 = [2,1,3,null,4,null,7]
输出:[3,4,5,5,4,null,7]

思路分析:

        可新建树,也可在原一棵树基础上改造。

        关键:同步遍历tree1,tree2。

        递归终止条件,任一为空就返回另一个。

代码实现:

/*** 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 mergeTrees(TreeNode root1, TreeNode root2) {//tree1,tree2同步遍历if(root1==null) return root2;if(root2==null) return root1;//直接在tree1改造,不新建树了root1.val+=root2.val;root1.left=mergeTrees(root1.left,root2.left);root1.right=mergeTrees(root1.right,root2.right);return root1;}
}

 700. 二叉搜索树中的搜索

题目描述:

给定二叉搜索树(BST)的根节点 root 和一个整数值 val

你需要在 BST 中找到节点值等于 val 的节点。 返回以该节点为根的子树。 如果节点不存在,则返回 null 。

示例 1:

输入:root = [4,2,7,1,3], val = 2
输出:[2,1,3]

思路分析:

遍历顺序:利用二叉搜索树自带的方向遍历。

代码实现:

/*** 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 searchBST(TreeNode root, int val) {// //迭代法// if(root==null) return root;// while(root!=null){//     if(root.val>val) root=root.left;//     else if(root.val<val) root=root.right;//     else return root;// }// return null;//递归法if(root==null || root.val==val) return root;if(root.val>val) return searchBST(root.left,val);if(root.val<val) return searchBST(root.right,val);return null;}
}

 98. 验证二叉搜索树

题目描述:

给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。

有效 二叉搜索树定义如下:

  • 节点的左

    子树

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

示例 1:

输入:root = [2,1,3]
输出:true

思路分析:

        在二叉搜索树中,使用中序遍历,元素由小到大排列。

        利用这一特点,使用前序遍历,前一节点与当前节点比较可得出结果。

代码实现:

/*** 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 {//二叉搜索树,中序遍历(从小到大)TreeNode pre=null;public boolean isValidBST(TreeNode root) {if(root==null) return true;//左if(!isValidBST(root.left)) return false;//中if(pre!=null && root.val<=pre.val) return false;pre=root;//右return isValidBST(root.right);}
}


http://www.ppmy.cn/embedded/23742.html

相关文章

盛势启创牵手盘古信息IMS,打造汽车零部件制造企业新标杆!

坐落于武汉市一家汽车零部件制造工厂内&#xff0c;7200㎡的厂房车间宽敞明亮&#xff0c;一排排智能化生产设备有序摆放&#xff0c;武汉盛势启创科技有限公司旗下的新能源汽车三电系统智能传感器、智能座舱及线控底盘控制器等产品正紧锣密鼓排产中。 坐落于武汉市一家汽车零…

新媒体矩阵号是怎么做的?

在新媒体这个充满机遇的平台上&#xff0c;矩阵账号已经成为吸引广泛观众和提高品牌曝光度的有力工具。通过创建多个账号&#xff0c;每个账号都有独特的内容和风格&#xff0c;可以形成一个强大的账号网络&#xff0c;提高粉丝的粘性和转化率。 本文将介绍如何打造新媒体矩阵…

Word图片被隐藏了怎么办?

背景 如下图&#xff0c;插入的图片被隐藏了 解决办法 选中图片&#xff0c;右上角有个图标&#xff0c;选择嵌入型 继续选中图片&#xff0c;在状态栏里的段落中&#xff0c;点击小箭头到设置里&#xff08;即段落设置&#xff09; 将行距改成单倍行距 完成

STM32、GD32驱动SHT30温湿度传感器源码分享

一、SHT30介绍 1、简介 SHT30是一种数字湿度和温度传感器&#xff0c;由Sensirion公司生产。它是基于物理蒸发原理的湿度传感器&#xff0c;具有高精度和长期稳定性。SHT30采用I2C数字接口&#xff0c;可以直接与微控制器或其他设备连接。该传感器具有低功耗和快速响应的特点…

AIX7环境上一次艰难的Oracle打补丁经历

系统环境 AIX &#xff1a;7200-05-03-2148 Oracle&#xff1a;11.2.0.4 PSU: 11.2.0.4.201020&#xff08;31718723&#xff09; perl:5.28 问题一&#xff1a;AUTO patch #/u01/app/11.2.0/grid/OPatch/opatch auto /tmp/31718723 错误信息如下&#xff1a;匹配mos 2516761.1…

SpringMVC基础篇(一)

文章目录 1.基本介绍1.特点2.SpringMVC跟SpringBoot的关系 2.快速入门1.需求分析2.图解3.环境搭建1.创建普通java工程2.添加web框架支持3.配置lib文件夹1.导入jar包2.Add as Library3.以后自动添加 4.配置tomcat1.配置上下文路径2.配置热加载 5.src下创建Spring配置文件applica…

华为海量数据库使用笔记

更多技术博客&#xff0c;请关注微信公众号&#xff1a;运维之美 一、常用命令 1.1 数据库连接命令 创建新用户 create user test password xxxx ; alter user test sysadminvsql -d test -hx.x.x.x -U test -p 5432 -W xxxxx1.2 数据库启停命令 vb_ctl start/stop/restar…

初识MVC

初识MVC 理论部分 今天第一次学MVC&#xff0c;拿到一个练手项目。现在来记录一下学习过程。 项目的背景就是个学生管理系统。我只做后端。 从大的来说MVC将应用程序分为三个主要组件&#xff08;部分&#xff09;&#xff1a; 模型&#xff08;Model&#xff09;是应用程序…