PROBLEM:
Given a Binary Search Tree (BST) with the root node root
, return the minimum difference between the values of any two different nodes in the tree.
Example :
Input: root = [4,2,6,1,3,null,null] Output: 1 Explanation: Note that root is a TreeNode object, not an array. The given tree [4,2,6,1,3,null,null] is represented by the following diagram: 4 / \ 2 6 / \ 1 3 while the minimum difference in this tree is 1, it occurs between node 1 and node 2, also between node 3 and node 2.
Note:
- The size of the BST will be between 2 and
100
. - The BST is always valid, each node's value is an integer, and each node's value is different.
SOLVE:
/**
* 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:
int minDiffInBST(TreeNode* root) {
vector<int> useless(2);
int minvalue=INT_MAX;
useless=minandmax(root,minvalue);
return minvalue;
}
vector<int> minandmax(TreeNode* root,int& minvalue){
vector<int> new2value(2,root->val);
vector<int> left2value(2);
vector<int> right2value(2);
if(!root->left&&!root->right) return new2value;
else if(!root->left){
right2value=minandmax(root->right,minvalue);
minvalue=right2value[0]-root->val<minvalue?right2value[0]-root->val:minvalue;
new2value[1]=right2value[1];
return new2value;
}
else if(!root->right){
left2value=minandmax(root->left,minvalue);
minvalue=root->val-left2value[1]<minvalue?root->val-left2value[1]:minvalue;
new2value[0]=left2value[0];
return new2value;
}
left2value=minandmax(root->left,minvalue);
right2value=minandmax(root->right,minvalue);
minvalue=root->val-left2value[1]<minvalue?root->val-left2value[1]:minvalue;
minvalue=right2value[0]-root->val<minvalue?right2value[0]-root->val:minvalue;
new2value[0]=left2value[0];
new2value[1]=right2value[1];
return new2value;
}
};
解释:题目中的“任意两节点”应该不只是相连的两个节点,还包括树中不相连的两个节点,所以我的方法是:对于树和每棵子树,分别计算根节点和左边最大值的差值,比较更新minvalue;计算根节点和右边最小值的差值,比较更新minvalue。minandmax()函数向外传递树中的最大值和最小值。