当前位置: 首页 > 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.xdnf.cn/news/1159489.html

相关文章:

  • LVS-----TUN模式配置
  • 【LeetCode刷题指南】--反转链表,链表的中间结点,合并两个有序链表
  • 【原创】微信小程序添加TDesign组件
  • tabBar设置底部菜单选项、iconfont图标(图片)库、模拟京东app的底部导航栏
  • 零基础学习性能测试第三章:执行性能测试
  • Windows CMD(命令提示符)中最常用的命令汇总和实战示例
  • 30天打牢数模基础-SVM讲解
  • Python 单例模式几种实现方式
  • Dify 1.6 安装与踩坑记录(Docker 方式)
  • ZooKeeper学习专栏(二):深入 Watch 机制与会话管理
  • 【单片机外部中断实验修改动态数码管0-99】2022-5-22
  • 大语言模型:人像摄影的“达芬奇转世”?——从算法解析到光影重塑的智能摄影革命
  • Vuex 核心知识详解:Vue2Vue3 状态管理指南
  • 【设计模式C#】享元模式(用于解决多次创建对象而导致的性能问题)
  • TypeScript 中替代 Interface 的方案
  • 17.TaskExecutor与ResourceManager交互
  • 对粒子群算法的理解与实例详解
  • 系统思考:整体论
  • 5.2.4 指令执行过程
  • 基于FPGA的多级流水线加法器verilog实现,包含testbench测试文件
  • Muon小记
  • 【unitrix】 6.9 减一操作(sub_one.rs)
  • 数据结构与算法汇总
  • Twisted study notes[2]
  • Node.js worker_threads 性能提升
  • ARM 学习笔记(三)
  • C 语言经典编程题实战:从基础算法到趣味问题全解析
  • python学智能算法(二十六)|SVM-拉格朗日函数构造
  • Beamer-LaTeX学习(教程批注版)【6】
  • AtCoder Beginner Contest 415