leetcode 530. 二叉搜索树的最小绝对差

题目描述

在这里插入图片描述
这里求二叉搜索树的最小绝对值的差,求最小且是二叉搜索树,因此最小绝对值肯定出现在两个相邻的节点处。因此这个题目有两种方法来做一种是递归,一种是转换为有序数组进行求解

做这个题的个人感想: 这道题也不是多难,只是对于我来说对于二叉树的递归遍历的理解更加深刻了。前序中序后序遍历的结果就相当于这种顺序放在数组里,因此我们只需要关心节点怎么进行处理,不用关心怎么递归的,同时对于回溯的理解也更加深刻了,感觉对二叉树的理解进入了一个更深的层次
下面来说代码实现,具体都在注释里

代码实现

转换为有序数组

class Solution {
public:
    void turn_nums(TreeNode* root, vector<int> &nums)
    {	// 中序遍历转换数组
        if(root==nullptr)
        {
            return;
        }
        turn_nums(root->left, nums);
        // 处理中间节点
        nums.push_back(root->val);
        turn_nums(root->right, nums);
    }
    int getMinimumDifference(TreeNode* root) {
        vector<int> nums;
        turn_nums(root, nums);
        int min = abs(nums[0] - nums[1]);
        for(int i=0; i<nums.size()-1; i++)
        {	// 设置一个min进行判断,不断更新
            if(min > abs(nums[i] - nums[i+1]))
            {
                min = abs(nums[i] - nums[i+1]);
            }
        }
        return min;
    }
};

递归法

class Solution {
private:
int result = INT_MAX;
// 设置pre节点为cur在中序遍历节点的前一个节点
TreeNode* pre = NULL;
void traversal(TreeNode* cur) {
    if (cur == NULL) return;
    traversal(cur->left);   // 左
    if (pre != NULL){       // 中
    	// 不断进行比较同时更新
        result = min(result, cur->val - pre->val);
    }
    pre = cur; // 记录前一个
    traversal(cur->right);  // 右
}
public:
    int getMinimumDifference(TreeNode* root) {
        traversal(root);
        return result;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值