题目链接
题目描述
给你一棵所有节点为非负值的二叉搜索树,请你计算树中任意两节点的差的绝对值的最小值。
示例:
输入:
1
\
3
/
2
输出:
1
解释:
最小绝对差为 1,其中 2 和 1 的差的绝对值为 1(或者 2 和 3)。
思路
因为是一颗二叉搜索树,显然我们可以通过中序遍历得到递增序列,又因为对升序数组求任意两个元素之差的绝对值的最小值,答案一定为相邻两个元素之差的最小值,因此我们可以采用中序遍历并计算遍历时相邻结点的差来不断更新答案。
具体实现的时候需要使用一个变量pre来保存前面一个遍历过的结点,同时考虑到pre结点有可能出现在当前结点的左子树,因此需要使用引用,从而保证回溯时依然能得到处于左子树中的pre结点。
代码如下:
class Solution {
public:
int ans;
void dfs(TreeNode* &pre,TreeNode *now){
if(now==NULL)
return;
else{
dfs(pre,now->left);
if(pre)
ans=min(abs(pre->val-now->val),ans);
pre=now;
dfs(pre,now->right);
}
}
int getMinimumDifference(TreeNode* root) {
ans=1<<30;
TreeNode *tmp=NULL;
dfs(tmp,root);
return ans;
}
};