Bootstrap

C++算法练习-day43——530.二叉搜索树的最小绝对差

题目来源:. - 力扣(LeetCode)
 

题目思路分析

题目要求我们在一个二叉搜索树(BST)中找到两个节点的最小差值,其中二叉搜索树的性质是:对于树中的每个节点,其左子树中的所有节点的值都小于该节点的值,而右子树中的所有节点的值都大于该节点的值。利用这一性质,我们可以进行中序遍历(左-根-右),这样遍历得到的节点值序列是递增的。一旦我们有了这个递增的节点值序列,就可以简单地计算相邻节点之间的差值,并找到最小的差值。

代码:

#include <climits> // 引入INT_MAX  
  
/**  
 * 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 {  
public:  
    // 深度优先搜索函数,用于中序遍历并计算最小差值  
    void dfs(TreeNode* root, int& pre, int& ans) {  
        if (!root) { // 如果当前节点为空,则直接返回  
            return;  
        }  
        dfs(root->left, pre, ans); // 遍历左子树  
          
        // 如果pre为-1,说明是第一个遍历到的节点,设置pre为当前节点的值  
        if (pre == -1) {  
            pre = root->val;  
        } else {  
            // 否则,计算当前节点与前一个节点的差值,并更新最小差值  
            ans = min(ans, root->val - pre);  
            pre = root->val; // 更新pre为当前节点的值  
        }  
          
        dfs(root->right, pre, ans); // 遍历右子树  
    }  
      
    // 主函数,用于获取二叉搜索树中两个节点的最小差值  
    int getMinimumDifference(TreeNode* root) {  
        int ans = INT_MAX; // 初始化最小差值为INT_MAX  
        int pre = -1; // 前一个节点的值,初始化为-1  
        dfs(root, pre, ans); // 调用深度优先搜索函数  
        return ans; // 返回最小差值  
    }  
};

知识点摘要

  1. 二叉搜索树(BST):一种特殊的二叉树,其中每个节点的值都大于其左子树所有节点的值,且小于其右子树所有节点的值。
  2. 中序遍历:对于二叉搜索树,中序遍历得到的节点值序列是递增的。
  3. 深度优先搜索(DFS):一种遍历或搜索树或图的算法,沿着每个分支尽可能深地搜索。
  4. 最小差值问题:通过中序遍历二叉搜索树,可以找到相邻节点之间的最小差值。

通过中序遍历二叉搜索树,我们可以得到一个递增的节点值序列。这个性质极大地简化了问题,使得我们只需要计算相邻节点之间的差值,并找到最小的差值。这种方法的时间复杂度是O(n),其中n是二叉搜索树中节点的数量,因为我们需要遍历每个节点一次。空间复杂度取决于树的高度,最坏情况下(树完全不平衡)是O(n),最好情况下(树完全平衡)是O(log n)。利用这一思路,我们能够高效地解决二叉搜索树中两个节点的最小差值问题。

;