方法一(更容易理解)
- 先中序遍历取出二叉搜索树的升序数组(二叉搜索树都是左小右大)
 - 然后遍历相减,比大小
 
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;
    }
};

京公网安备 11010502036488号