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

二叉搜索树最小差值

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
秋招专场
校招火热招聘中
官网直投

相关推荐

头像
不愿透露姓名的神秘牛友
05-28 17:15
猿辅导 Java后端日常实习 800一天
点赞 评论 收藏
转发
1 收藏 评论
分享
牛客网
牛客企业服务