题目描述
这里求二叉搜索树的最小绝对值的差,求最小且是二叉搜索树,因此最小绝对值肯定出现在两个相邻的节点处。因此这个题目有两种方法来做一种是递归,一种是转换为有序数组进行求解
做这个题的个人感想: 这道题也不是多难,只是对于我来说对于二叉树的递归遍历的理解更加深刻了。前序中序后序遍历的结果就相当于这种顺序放在数组里,因此我们只需要关心节点怎么进行处理,不用关心怎么递归的,同时对于回溯的理解也更加深刻了,感觉对二叉树的理解进入了一个更深的层次
下面来说代码实现,具体都在注释里
代码实现
转换为有序数组
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;
}
};