力扣 二叉搜索树的最小绝对差
题目描述
给你一棵所有节点为非负值的二叉搜索树,请你计算树中任意两节点的差的绝对值的最小值。
示例:
输入:
1
3
/
2
输出:
1
解释:
最小绝对差为 1,其中 2 和 1 的差的绝对值为 1(或者 2 和 3)。
思路要点
-
利用二叉搜索树的性质: 左子树<根节点<右子树, 于是中序遍历二叉树就可以得到升序数组, 遍历过程中相邻的结点之间的差的最小值即为符合题目要求的答案
-
可以在中序遍历的过程中用pre 变量保存前驱节点的值,这样即能边遍历边更新答案,不再需要显式创建数组来保存,需要注意的是pre 的初始值需要设置成任意负数标记开头,下文代码中设置为 -1.
-
AC代码:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution
{
public:
void dfs(TreeNode* root, int& pre, int& ans)
{
if (root == nullptr)
{
return;
}
dfs(root->left, pre, ans);
if (pre == -1)
{
pre = root->val;
}
else
{
ans = min(ans, root->val - pre);
pre = root->val;
}
dfs(root->right, pre, ans);
}
int getMinimumDifference(TreeNode* root)
{
int ans = INT_MAX, pre = -1;
dfs(root, pre, ans);
return ans;
}
};