QUESTION
easy
题目描述
给定一个所有节点为非负值的二叉搜索树,求树中任意两节点的差的绝对值的最小值。
示例 :
输入:
1
\
3
/
2
输出:
1
解释:
最小绝对差为 1,其中 2 和 1 的差的绝对值为 1(或者 2 和 3)。
说明
注意: 树中至少有2个节点。
SOLUTION
这个问题的关键就是,我们需要知道如何通过 BST 树得到一个假想的有序的数组,然后通过遍历它,得到答案。
方法一
用中序遍历把树存进数组,得到递增的数组,然后遍历即可。
class Solution {
public:
int getMinimumDifference(TreeNode* root) {
vector<int> in;
int res = INT_MAX, tmp;
inorder(root, in);
for(int i = 0; i < in.size() - 1; i++){
tmp = in[i + 1] - in[i];
if(tmp < res) res = tmp;
}
return res;
}
void inorder(TreeNode* node, vector<int> &in){
if(node == nullptr) return;
inorder(node->left, in);
in.push_back(node->val);
inorder(node->right, in);
}
};
方法二
同方法一的思想,不使用数组保存,但是使用一个 pre
指针指向递增数组中的前一个,节省一些空间,在中序遍历中动态地判断绝对值最小。
class Solution {
public:
int getMinimumDifference(TreeNode* root) {
int res = INT_MAX;
TreeNode* pre = nullptr;
inorder(root, pre, res);
return res;
}
void inorder(TreeNode* node, TreeNode*& pre, int &res){
if(node == nullptr) return;
inorder(node->left, pre, res);
if(pre != nullptr) res = min(res, node->val - pre->val);
pre = node;
inorder(node->right, pre, res);
}
};