方法一(更容易理解)

  • 先中序遍历取出二叉搜索树的升序数组(二叉搜索树都是左小右大)
  • 然后遍历相减,比大小

c++实现

class Solution {
public:
    vector<int> t;
    void mid(TreeNode* root){
        if(!root) return ;
        mid(root->left);
        t.push_back(root->val);
        mid(root->right);
    }
    
    int minDifference(TreeNode* root) {
        // write code here
        mid(root); //中序遍历,将二叉搜索树升序取出来
        if(t.size() < 2) return -1;
        int v=t[1]-t[0];
        for(int i=1; i<t.size()-1; i++){
            if(t[i+1]-t[i] < v){
                v = t[i+1]-t[i];
            }
        }
        return v;
    }
};

方法二(效率更高)

其实二叉树一次遍历就可以解决这个问题:

  • 用当前节点减去左子节点(root - root->left),取min值
  • 用当前节点的右子节点减去当前节点(root->right - root),取min值
  • 递归左节点、右节点

c++实现

class Solution {
public:
    void func(TreeNode* root, int &res){
        if(!root) return;
        if(root->left) res = min(res, root->val - root->left->val);
        if(root->right) res = min(res, root->right->val - root->val);
        func(root->left, res);
        func(root->right, res);
    }
    
    int minDifference(TreeNode* root) {
        int res = INT_MAX;
        func(root, res);
        return res;
    }
};