求:
给你一棵所有节点为非负值的二叉搜索树,请你计算树中任意两节点的差的绝对值的最小值。
示例:
输入:
1
\
3
/
2
输出:
1
解释:
最小绝对差为 1,其中 2 和 1 的差的绝对值为 1(或者 2 和 3)。
提示:
树中至少有 2 个节点。
本题与 783 https://leetcode-cn.com/problems/minimum-distance-between-bst-nodes/ 相同
解:
思路:
根据二叉搜索树的定义,二叉搜索树或者是空树,或者是一颗这样的二叉树:对任意节点,左子树上的节点的值均小于该节点的值。右子树上的节点的值均大于该节点的值。因此如果我们对二叉搜索树执行中序遍历,则得到的值按升序排列。我们递归得进行中序遍历,当计算当前节点时,将当前节点与左子树最大的值(沿着左子树的右子树一直遍历),右子树最小的值进行比较(沿着右子树的左子树一直遍历),将最小的差值保留。最后输出。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
int
min(
int
x,
int
y){
return
x
}
int
getMinimumDifference(
struct
TreeNode* root){
if
(root==NULL)
return
INT_MAX;
int
minRoot=INT_MAX;
int
minLeft,minRight;
minLeft = getMinimumDifference(root->left);
if
(root->left!=NULL){
struct
TreeNode* t = root->left;
while
(t->right!=NULL) t=t->right;
minRoot = abs(root->val-t->val);
}
if
(root->right!=NULL){
struct
TreeNode* t = root->right;
while
(t->left!=NULL) t=t->left;
if
(abs(root->val-t->val)val-t->val);
}
minRight = getMinimumDifference(root->right);
return
min(min(minLeft,minRoot),minRight);
}