题解 | #二叉搜索树最小差值#递归遍历

二叉搜索树最小差值

http://www.nowcoder.com/practice/f8ac976b49bd450887b9281f315186c7

方法一(更容易理解)

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

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;
    }
};
全部评论
第二种方法错的
1 回复 分享
发布于 2022-04-24 18:32
第二种方法,差值最小的不一定是在相邻的点之间吧
1 回复 分享
发布于 2022-08-09 18:18

相关推荐

给🐭🐭个面试机会吧:嘿,mvbatis
点赞 评论 收藏
分享
2024-12-26 13:00
太原理工大学 Java
会飞的猿:简历没啥大问题啊,感觉是缺少了实习经历。多投投先找个中小厂过渡一下吧
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务