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

leetcode530:二叉搜索树的最小绝对值差

步骤1:问题定义与分析

  • 输入:一个二叉搜索树的根节点
  • 输出:树中任意两不同节点值之间的最小差值
  • 限制条件:
    • 节点数量范围:[2, 10^4]
    • 节点值范围:[0, 10^5]
    • 差值必须为正数
  • 关键特性:这是一个二叉搜索树(BST),具有以下性质:
    • 左子树所有节点值小于根节点
    • 右子树所有节点值大于根节点
    • 中序遍历会得到一个有序序列

步骤2:解决方案分析

  1. 方案一:暴力法

    • 获取所有节点值,两两比较
    • 时间复杂度:O(n^2)
    • 空间复杂度:O(n)
    • 不推荐,效率低
  2. 方案二:利用BST特性(最优解)

    • 中序遍历BST得到有序序列
    • 相邻节点差值最小即为答案
    • 时间复杂度:O(n)
    • 空间复杂度:O(1)
    • 推荐使用,充分利用BST特性

步骤3:代码实现

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
private:
    int minDiff = INT_MAX;  // 存储最小差值
    int prevVal = -1;       // 存储前一个节点的值
    
    // 中序遍历函数
    void inorderTraversal(TreeNode* root) {
        if (!root) return;
        
        // 遍历左子树
        inorderTraversal(root->left);
        
        // 处理当前节点
        if (prevVal != -1) {
            // 计算当前节点与前一个节点的差值
            minDiff = min(minDiff, root->val - prevVal);
        }
        prevVal = root->val;  // 更新前一个节点的值
        
        // 遍历右子树
        inorderTraversal(root->right);
    }
    
public:
    int getMinimumDifference(TreeNode* root) {
        inorderTraversal(root);
        return minDiff;
    }
};

步骤4:解题启发

  1. 数据结构特性的重要性:

    • BST的中序遍历特性直接简化了问题
    • 正确利用数据结构特性可以大幅降低算法复杂度
  2. 状态记录的技巧:

    • 使用prevVal记录前一个节点值,避免了额外的存储空间
    • 体现了空间优化的重要性

http://www.kler.cn/a/419861.html

相关文章:

  • Zustand的学习和应用
  • 【Spring】介绍一下 Spring 的 xml 标签以及 Bean 的常用配置
  • 《智能体雏形开发(高阶实操)》开发计划概述
  • 使用Python和OpenCV自动检测并去除图像中的字幕
  • Markdown 使用教程
  • 【鸿蒙NEXT】arrayBuffer和base64字符串互相转换
  • GitHub Copilot革命性更新:整合顶尖AI模型,如何重塑开发体验?
  • 用 React 编写一个笔记应用程序
  • SQL优化与性能——C++与SQL性能优化
  • 重学设计模式-建造者模式
  • 题海拾贝——生成元(Digit Generator,ACM/ICPC SEOUL 2005,UVa1583)
  • 15.三数之和 python
  • 深度学习模型:门控循环单元(GRU)详解
  • Web基础
  • java中的运算符
  • Elasticsearch面试内容整理-面试注意事项
  • Python 深度学习框架之Keras库详解
  • AI在线免费视频工具4:AI视频编辑ai-video-composer
  • 2024.12.2工作复盘
  • Ubuntu20.04安装NVIDIA显卡驱动
  • parallelStream并行流使用踩坑,集合安全
  • 4399 Android面试题及参考答案
  • [382]基于springboot的辽B代驾管理系统
  • 论文阅读:Deep divergence-based approach to clustering
  • 【HarmonyOS】自定义相机拍照和录像 (二)之录像
  • iptables 用于设置、维护和检查 IP 数据包的过滤规则。其基本用法是通过命令行界面配置流量的过滤策略,分为以下几类规则链:INPUT(入站流量)、OU