给定一个二叉搜索树的根结点 root, 返回树中任意两节点的差的最小值。
示例:
输入: root = [4,2,6,1,3,null,null]
输出: 1
解释:
注意,root是树结点对象(TreeNode object),而不是数组。
给定的树 [4,2,6,1,3,null,null] 可表示为下图:
4
/ \
2 6
/ \
1 3
最小的差值是 1, 它是节点1和节点2的差值, 也是节点3和节点2的差值。
注意:
二叉树的大小范围在 2 到 100。
二叉树总是有效的,每个节点的值都是整数,且不重复。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/minimum-distance-between-bst-nodes
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路
1.根据二叉搜索树的性质,中序遍历二叉搜索树可以得到一个结点值递增的序列,然后在遍历的过程中存储这个序列,再用循环遍历这个序列求相邻元素间的最小差值。
/**
* 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 res; //存储节点最小距离
vector<int> v; //存储节点序列
void search(TreeNode* root){ //进行中序遍历
if(!root)
return;
search(root->left);
v.push_back(root->val); //将各个节点的值存入向量
search(root->right);
}
int minDiffInBST(TreeNode* root) {
if(!root)
return NULL;
res=9999;
search(root);
for(int i=0;i<v.size();i++){ //bian
for(int j=i+1;j<v.size();j++){
if(res>abs(v[i]-v[j])){
res=abs(v[i]-v[j]);
}
}
}
return res;
}
};
2.在进行中序遍历二叉树的时候,不断更新当前节点与上一节点的差值,这样,当遍历完整颗树时,就找到了节点的最小距离了。
- pre(上一个结点的值)需要初始化;
- 不断更新pre和res;
/**
* 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 res;
vector<int> v;
int pre;
void search(TreeNode* root){
if(!root)
return;
search(root->left);
res=min(res,abs(root->val-pre)); //找结点最小距离
pre=root->val; //更新pre
search(root->right);
}
int minDiffInBST(TreeNode* root) {
if(!root)
return 0;
res=9999;
pre=9999; //初始化pre
search(root);
return res;
}
};