题目:
- 给你一个二叉搜索树的根节点
root
,返回 树中任意两不同节点值之间的最小差值 。差值是一个正数,其数值等于两值之差的绝对值。
示例:
- 输入: r o o t = [ 4 , 2 , 6 , 1 , 3 ] root = [4,2,6,1,3] root=[4,2,6,1,3]
- 输出: 1 1 1
解题思路一:利用二叉搜索树特性
由于二叉搜索树的中序遍历是有序的,因此用数组存下中序遍历结果,然后遍历一遍数组,查找相邻两元素的最小差值返回即可。
class Solution {
public:
vector<int> res_vec;
void dfs(TreeNode* cur){
if(cur == NULL) return;
dfs(cur->left);
res_vec.push_back(cur->val);
dfs(cur->right);
}
int getMinimumDifference(TreeNode* root) {
res_vec.clear();
dfs(root);
int min_res = INT_MAX;
for(int i = 1; i < res_vec.size(); i++){
int cha = abs(res_vec[i] - res_vec[i - 1]);
if(cha < min_res) min_res = cha;
}
return min_res;
}
};
-
确定递归函数的参数和返回值:
定义pre
来存放中序遍历中前一个节点,res_cha
存放最小差值。TreeNode* pre = NULL; int res_cha = INT_MAX; void dfs(TreeNode* cur){}
-
确定终止条件:
如果当前节点为空则返回if(cur == NULL) return;
-
确定单层递归的逻辑:
中序遍历,更新最小差值。dfs(cur->left); if(pre != NULL){ int cha = abs(pre->val - cur->val); if(cha < res_cha) res_cha = cha; } pre = cur; dfs(cur->right);
C++版整体代码
class Solution {
public:
TreeNode* pre = NULL;
int res_cha = INT_MAX;
void dfs(TreeNode* cur){
if(cur == NULL) return;
dfs(cur->left);
if(pre != NULL){
int cha = abs(pre->val - cur->val);
if(cha < res_cha) res_cha = cha;
}
pre = cur;
dfs(cur->right);
}
int getMinimumDifference(TreeNode* root) {
dfs(root);
return res_cha;
}
};