【数据结构与算法 | 搜索二叉树篇 && 力扣篇】力扣530, 501

1. 力扣530:二叉搜索树的最小绝对差

1.1 题目:

给你一个二叉搜索树的根节点 root ,返回 树中任意两不同节点值之间的最小差值

差值是一个正数,其数值等于两值之差的绝对值。

示例 1:

复制代码
输入:root = [4,2,6,1,3]
输出:1

示例 2:

复制代码
输入:root = [1,0,48,null,null,12,49]
输出:1

提示:

  • 树中节点的数目范围是 [2, 104]
  • 0 <= Node.val <= 105

1.2 思路

题目虽然说求任意两个不同的节点的差值,但很容易发现,排序以后,只需要比较两个相邻节点的差值即可。

1.3 题解:

java 复制代码
/**
 * 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 {
    // 用列表记录二叉树节点的值
    List<Integer> list = new ArrayList<>();
    public int getMinimumDifference(TreeNode root) {
        recursion(root);
        // 调用库方法排序
        Collections.sort(list);
        // 因为由题,该二叉树最少两个节点
        int targrt = list.get(0) - list.get(1);
        if(targrt < 0) {
            targrt = -targrt;
        }
        // 排序以后只需要比较两个相邻的元素的差值
        for(int i = 0; i < list.size() - 1; i++) {
            int diff = list.get(i) - list.get(i + 1);
            if(diff < 0) {
                diff = -diff;
            }
            targrt = targrt > diff ? diff : targrt;
        }
        return targrt;
    }
    private void recursion(TreeNode node) {
        if(node == null) {
            return;
        }
        list.add(node.val);
        recursion(node.left);
        recursion(node.right);
    }
}

2. 力扣501:二叉搜索树中的众数

2.1 题目:

给你一个含重复值的二叉搜索树(BST)的根节点 root ,找出并返回 BST 中的所有 众数(即,出现频率最高的元素)。

如果树中有不止一个众数,可以按 任意顺序 返回。

假定 BST 满足如下定义:

  • 结点左子树中所含节点的值 小于等于 当前节点的值
  • 结点右子树中所含节点的值 大于等于 当前节点的值
  • 左子树和右子树都是二叉搜索树

示例 1:

复制代码
输入:root = [1,null,2,2]
输出:[2]

示例 2:

复制代码
输入:root = [0]
输出:[0]

提示:

  • 树中节点的数目在范围 [1, 104]
  • -105 <= Node.val <= 105

**进阶:**你可以不使用额外的空间吗?(假设由递归产生的隐式调用栈的开销不被计算在内)

2.2 思路:

使用到了哈希表,动态数组和递归。哈希表的键用来存储节点的值,值用来存储节点值的个数。用max_num来判断是否需要向列表中添加元素。最后列表中剩下来的元素就是最后要返回的元素。但方法要求返回一个数组,那么就简单转换以下就好了。

个人感觉还可以用计数排序来解决这个问题,应该会更加的简洁和方便。

2.3 题解

java 复制代码
/**
 * 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 {
    HashMap<Integer, Integer> hashmap = new HashMap<>();
    // 哈希表用键存储节点的值,用值来存储节点的值出现的次数
    int max_num;
    //该变量表示众数
    List<Integer> list = new ArrayList<>();
    public int[] findMode(TreeNode root) {
        recursion(root);
        int[] target = new int[list.size()];
        for(int i = 0; i < list.size();i++){
            target[i] = list.get(i);
        }
        return target;
    }
    private void recursion(TreeNode node) {
        if(node == null) {
            return;
        }
        // 记录操作之前的max_num,用于后续比较
        int old_max_num = max_num;
        if(!hashmap.containsKey(node.val)){
            hashmap.put(node.val, 1);
            max_num = Integer.max(max_num, 1);
        } else {
            hashmap.put(node.val, hashmap.get(node.val) + 1);
            max_num = Integer.max(max_num, hashmap.get(node.val));
        }
        //看max_num做没做出更新,如果做出更新,则清空列表
        // 如果没做出更新,但是该节点的值的个数与最大值一样,则加入到列表
        if(old_max_num != max_num){
            list.clear();
            list.add(node.val);
        } else if(max_num == hashmap.get(node.val)){
            list.add(node.val);
        }
        recursion(node.left);
        recursion(node.right);
    }
}
相关推荐
Salt_072812 小时前
DAY44 简单 CNN
python·深度学习·神经网络·算法·机器学习·计算机视觉·cnn
货拉拉技术12 小时前
AI拍货选车,开启拉货新体验
算法
MobotStone12 小时前
一夜蒸发1000亿美元后,Google用什么夺回AI王座
算法
Wang2012201312 小时前
RNN和LSTM对比
人工智能·算法·架构
xueyongfu12 小时前
从Diffusion到VLA pi0(π0)
人工智能·算法·stable diffusion
永远睡不够的入12 小时前
快排(非递归)和归并的实现
数据结构·算法·深度优先
cheems952712 小时前
二叉树深搜算法练习(一)
数据结构·算法
sin_hielo12 小时前
leetcode 3074
数据结构·算法·leetcode
Yzzz-F13 小时前
算法竞赛进阶指南 动态规划 背包
算法·动态规划
程序员-King.13 小时前
day124—二分查找—最小化数组中的最大值(LeetCode-2439)
算法·leetcode·二分查找