【随想录】Day21—第六章 二叉树part07

2024-04-15 16:36

本文主要是介绍【随想录】Day21—第六章 二叉树part07,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • 题目1: 530. 二叉搜索树的最小绝对差
    • 1- 思路
    • 2- 题解
      • ⭐ 二叉搜索树的最小绝对差 ——题解思路
  • 题目2: 二叉搜索树中的众数
    • 1- 思路
    • 2- 题解
      • ⭐ 二叉搜索树中的众数 ——题解思路
  • 题目3: 二叉树的最近公共祖先
    • 1- 思路
    • 2- 题解
      • ⭐ 二叉树的最近公共祖先 ——题解思路


题目1: 530. 二叉搜索树的最小绝对差

  • 题目链接:530. 二叉搜索树的最小绝对差

1- 思路

中序遍历,将遍历结果收集到数组中

  • 遍历数组,求解数组两个元素之间的差值

2- 题解

⭐ 二叉搜索树的最小绝对差 ——题解思路

在这里插入图片描述

class Solution {List<Integer> res = new ArrayList<>();public int getMinimumDifference(TreeNode root) {inorder(root);int[] nums = new int[res.size()];for(int i = 0 ; i < nums.length;i++){nums[i] = res.get(i);}int min = 999999;for(int i = 1 ; i < nums.length;i++){int tmp = nums[i] - nums[i-1];if(tmp<min){min = tmp;}}return min;}public void inorder(TreeNode root){if(root==null){return;}inorder(root.left);res.add(root.val);inorder(root.right);}
}

题目2: 二叉搜索树中的众数

  • 题目链接:501. 二叉搜索树中的众数

1- 思路

使用递归实现二叉搜索树中的众数
在二叉树:搜索树的最小绝对差中我们就使用了pre指针和cur指针的技巧,这次又用上了。
技巧:

  • 1. 利用 cur 和 pre 指针
  • 2. pre 记录 cur 的前一个值:由于是递归,且是中序的顺序,因此可以理解为从 BST 的左下角的结点开始
  • 3. 递归三部曲
    • 3.1 终止条件:遇到 null 则返回
    • 3.2 单层递归
    • 对 count 计数
      • 采用中序遍历,左 中 右 的顺序,中的判断:如果 pre 为 null 或者 pre 和 cur 的值不相等,则 count 归 1 重新开始计数。
    • **更新 count **
      • 如果当前 count 大于 maxCount 证明需要对 maxCount 更新,且 res 结果集需要清空,且加入当前 值
      • 如果 count == maxCount ,证明此时找到了结果,收集结果
      • 最终移动 pre
public void findMode1(TreeNode root) {if (root == null) {return;}findMode1(root.left);int rootValue = root.val;// 计数if (pre == null || rootValue != pre.val) {count = 1;} else {count++;}// 更新结果以及maxCountif (count > maxCount) {resList.clear();resList.add(rootValue);maxCount = count;} else if (count == maxCount) {resList.add(rootValue);}pre = root;findMode1(root.right);
}

2- 题解

⭐ 二叉搜索树中的众数 ——题解思路

![class Solution {// 数据结构List<Integer> res = new ArrayList<>();](https://img-blog.csdnimg.cn/direct/66c7f6e9e0ac4b8fafecc31f1d480505.png)int count;int maxCount;TreeNode pre;public int[] findMode(TreeNode root) {count = 0;maxCount = 0;pre = new TreeNode();find(root);int[] resNums = new int[res.size()];for(int i = 0 ; i < resNums.length;i++){resNums[i] = res.get(i);}return resNums;}public void find(TreeNode root){if(root==null){return;}find(root.left);// 单层// 处理 count++ 逻辑int nowValue = root.val;if(pre==null || pre.val!=nowValue){count=1;}else{count+=1;}if(count>maxCount){res.clear();maxCount = count;res.add(nowValue);}else{res.add(nowValue);}pre = root;find(root.right);}
}

题目3: 二叉树的最近公共祖先

  • 题目链接:236. 二叉树的最近公共祖先

1- 思路

递归三部曲


2- 题解

⭐ 二叉树的最近公共祖先 ——题解思路

在这里插入图片描述

class Solution {public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {if(root==null || root==p || root==q){return root;}TreeNode left = lowestCommonAncestor(root.left,p,q);TreeNode right = lowestCommonAncestor(root.right,p,q);if(left==null && right==null){return null;}else if(left!=null && right==null){return left;}else if(left==null && right!=null){return right;}else{return root;}}
}

这篇关于【随想录】Day21—第六章 二叉树part07的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/906336

相关文章

代码随想录冲冲冲 Day39 动态规划Part7

198. 打家劫舍 dp数组的意义是在第i位的时候偷的最大钱数是多少 如果nums的size为0 总价值当然就是0 如果nums的size为1 总价值是nums[0] 遍历顺序就是从小到大遍历 之后是递推公式 对于dp[i]的最大价值来说有两种可能 1.偷第i个 那么最大价值就是dp[i-2]+nums[i] 2.不偷第i个 那么价值就是dp[i-1] 之后取这两个的最大值就是d

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

根据一棵树的前序遍历与中序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如,给出 前序遍历 preorder = [3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树: 3/ \9 20/ \15 7   class Solution {public TreeNode buildTree(int[] pr

PHP实现二叉树遍历(非递归方式,栈模拟实现)

二叉树定义是这样的:一棵非空的二叉树由根结点及左、右子树这三个基本部分组成,根据节点的访问位置不同有三种遍历方式: ① NLR:前序遍历(PreorderTraversal亦称(先序遍历)) ——访问结点的操作发生在遍历其左右子树之前。 ② LNR:中序遍历(InorderTraversal) ——访问结点的操作发生在遍历其左右子树之中(间)。 ③ LRN:后序遍历(PostorderT

第六章习题11.输出以下图形

🌏个人博客:尹蓝锐的博客 希望文章能够给到初学的你一些启发~ 如果觉得文章对你有帮助的话,点赞 + 关注+ 收藏支持一下笔者吧~ 1、题目要求: 输出以下图形

代码随想录训练营day37|52. 携带研究材料,518.零钱兑换II,377. 组合总和 Ⅳ,70. 爬楼梯

52. 携带研究材料 这是一个完全背包问题,就是每个物品可以无限放。 在一维滚动数组的时候规定了遍历顺序是要从后往前的,就是因为不能多次放物体。 所以这里能多次放物体只需要把遍历顺序改改就好了 # include<iostream># include<vector>using namespace std;int main(){int n,m;cin>>n>>m;std::vector<i

代码随想录打卡Day25

今天一整天都在教研室做实验,没时间刷题,就做了一题,剩下的明天补 491.递增子序列 这道题目和之前的子集问题很像,但是有一点要注意的,这个输入的数组不能进行排序,所以就不能沿用之前的去重逻辑,这道题要去重还是得借助额外的变量来维护元素使用情况,但是这题的used为集合,且不能为全局变量,只能为树层遍历前定义的一个局部变量,除了这个改动以外,其他地方都是高度相似的。 class Soluti

在二叉树中找到两个节点的最近公共祖先(基于Java)

如题  题解 public int lowestCommonAncestor(TreeNode root, int o1, int o2) {//记录遍历到的每个节点的父节点。Map<Integer, Integer> parent = new HashMap<>();Queue<TreeNode> queue = new LinkedList<>();parent.put(roo

数据结构--二叉树(C语言实现,超详细!!!)

文章目录 二叉树的概念代码实现二叉树的定义创建一棵树并初始化组装二叉树前序遍历中序遍历后序遍历计算树的结点个数求二叉树第K层的结点个数求二叉树高度查找X所在的结点查找指定节点在不在完整代码 二叉树的概念 二叉树(Binary Tree)是数据结构中一种非常重要的树形结构,它的特点是每个节点最多有两个子节点,通常称为左子节点和右子节点。这种结构使得二叉树在数据存储和查找等方面具

代码随想录刷题day25丨491.递增子序列 ,46.全排列 ,47.全排列 II

代码随想录刷题day25丨491.递增子序列 ,46.全排列 ,47.全排列 II 1.题目 1.1递增子序列 题目链接:491. 非递减子序列 - 力扣(LeetCode) 视频讲解:回溯算法精讲,树层去重与树枝去重 | LeetCode:491.递增子序列_哔哩哔哩_bilibili 文档讲解:https://programmercarl.com/0491.%E9%80%92%E

代码随想录算法训练营Day37|完全背包问题、518.零钱兑换II、377. 组合总和 Ⅳ、70. 爬楼梯(进阶版)

完全背包问题                  和01背包最大区别就是一个物品可以重复放多次,因此遍历空间时可以从前往后。 import java.util.*;public class Main{public static void main (String[] args) {Scanner sc = new Scanner(System.in);int m = sc.nextInt