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

【算法训练营Day15】二叉树part5

文章目录

  • 最大二叉树
  • 合并二叉树
  • 二叉搜索树中的搜索
  • 验证二叉搜索树

最大二叉树

题目链接:654. 最大二叉树

解题逻辑:

这一题与106. 从中序与后序遍历序列构造二叉树很相似,都是通过切割数组完成二叉树的构建,但这题稍微简单一些。

我们可以通过先构建左右子树再拼接上根节点的方式来构建二叉树,所以我们选用后序遍历。接下来通过递归三部曲来分析:

  • 递归参数与返回值:我们需要接受递归的返回值用来构建左右子树,所以返回值定为TreeNode,而参数按照题意定位数组即可
  • 递归出口
    • 当数组为空的时候直接返回null
    • 当数组的长度为1的时候直接返回这个唯一值的节点即可
  • 递归单层逻辑
    • 通过for循环找到数组的最大值以及最大值的索引值
    • 根据最大值的索引对数组进行切分
    • 构造左、右节点
    • 根据最大值创建根节点然后拼接左右节点

代码如下:

class Solution {public TreeNode constructMaximumBinaryTree(int[] nums) {if(nums.length == 0) return null;else if(nums.length == 1) return new TreeNode(nums[0]);int devideIndex = 0;int max = 0;for(int i = 0;i < nums.length;i++) {if(nums[i] >= max) {devideIndex = i;max = nums[i];}}TreeNode left = constructMaximumBinaryTree(Arrays.copyOfRange(nums,0,devideIndex));TreeNode right;if(devideIndex + 1 > nums.length) right = null;else right = constructMaximumBinaryTree(Arrays.copyOfRange(nums,devideIndex + 1,nums.length));TreeNode root = new TreeNode(max);root.left = left;root.right = right;return root;}
}

合并二叉树

题目链接:617. 合并二叉树

解题逻辑:

本题的核心就是同时对两棵树进行递归遍历,在这里我们选用后序遍历,然后从递归三部曲的角度来分析:

  • 递归参数与返回值,参数因为是同时遍历两棵树所以要接收两个树节点,然后返回值就是TreeNode用来返回根节点
  • 递归出口:既然是两棵树同时遍历,再根据题目条件,也就是说两棵树的相同位置节点只要有一个不为null,那么就要遍历到,所以在这里我们的出口条件就是只有当两个节点均为null的时候才会推出递归。
  • 单层递归逻辑:
    • 递归获得左右节点
    • 根据传入的两个节点,如果有一个不为null,则使用该节点作为根节点
    • 如果都不为null,则将两节点的值相加作为新的根节点

代码如下:

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

二叉搜索树中的搜索

题目链接:700. 二叉搜索树中的搜索

解题逻辑:本题较为简单,直接比较节点值与搜索值,节点值比搜索值大,则往左递归查询,反之向右递归查询。

代码如下:

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

验证二叉搜索树

题目链接:98.验证二叉搜索树

解题逻辑:

首先要明确二叉搜索树的概念是:根节点大于左子树,小于右子树

很容易错误理解为根节点大于左节点,小于右节点

他还有一个非常重要的特性就是其中序遍历是单调递增的,那么凭借这个特性我们就可以建立初步的思路。

代码如下:

class Solution {long value = Long.MIN_VALUE;public boolean isValidBST(TreeNode root) {if(root == null) return true;boolean left = isValidBST(root.left);if(left == false) return false;if(root.val <= value) return false;else value =  root.val;boolean right = isValidBST(root.right);if(right == false) return false;return true;}
}
http://www.dtcms.com/a/289808.html

相关文章:

  • 编程研发工作日记
  • 050_Set接口(HashSet / TreeSet / LinkedHashSet)
  • 力扣面试150题--搜索插入位置
  • 某市公安局视频图像信息综合应用平台设计方案Word(446页)
  • AI产品经理面试宝典第40天:用户反馈处理与技术应用面试题与答法
  • 多校2+多校1的遗珠
  • 信道相关系数
  • 安装kali时出现“安装步骤失败“如何解决及后续软件安装
  • Python自动化测试项目实战
  • QT项目-仿QQ音乐的音乐播放器(第一节)
  • 什么是卡贴???
  • 国产电钢琴性价比实战选购指南
  • Python 虚拟环境与构建工具全景指南:功能介绍与对比分析
  • 基于Transformer的心理健康对话系统:从零构建AI心理咨询助手
  • 【全球甲烷估算模型】简化一箱模型(1-box model)
  • MySQL中的排序和分页
  • [simdjson] 实现不同CPU调度 | 自动硬件适配的抽象
  • C 语言经典编程题实战:从基础算法到趣味问题全解析
  • MybatisPlus-09.核心功能-IService开发复杂业务接口
  • 论文阅读:BLIP-2 (2023.4)
  • KOSMOS-2: 将多模态大型语言模型与世界对接
  • 第一章: 初识 Redis:背后的特性和典型应用场景
  • 你的created_time字段,用DATETIME还是TIMESTAMP?
  • brpc的安装与使用介绍以及channel的封装
  • spring-ai-alibaba 迭代字符分割器
  • RPG61.制作敌人攻击波数一
  • 30天打牢数模基础-AdaBoost讲解
  • CICS Application Programming Fundamentals 第8-6章
  • arinc818_icd设计范例
  • LLVM中AST节点类型