Leetcode 783二叉搜索树节点最小距离、
题目
给定一个二叉搜索树的根结点 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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
分析
leetcode给出的分类为递归,我特么就瞎用递归。。。
下面是错误解法:
/**
* 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) {
int ans=98;
if(root==NULL){
return 98;
}
int left=minDiffInBST(root->left);
int right=minDiffInBST(root->right);
ans=left>=right?right:left;
if(root->left!=NULL && root->val-root->left->val<ans){
ans=root->val-root->left->val;
}
if(root->right!=NULL && root->right->val-root->val<ans){
ans=root->right->val-root->val;
}
return ans;
}
};
真的好der,完全没有考虑到很容易就知道我错误的情况,[90,69,null,49,89,null,52,null,null,null,null]
这里就不画图了
如果在当时考研的时候,应该是可以想到这个方法的:二叉搜索树有一个最重要的性质不能忘记啊,那就是中序遍历二叉搜索树得到的序列是有序序列啊,所有这个问题只需要用中序遍历二叉树,计算相邻两个数的差,记录最小的值就行了。代码如下:
/**
* 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> inorder;
stack<TreeNode*> nodeStack;
nodeStack.push(root);
TreeNode *left = root->left;
TreeNode *p;
while (!nodeStack.empty()) {
if (left) {//一直找到最左节点
nodeStack.push(left);
left = left->left;
} else { //出栈
p = nodeStack.top();
nodeStack.pop();
inorder.push_back(p->val);//出栈的时候加入结果集,注意下面右节点入栈的时候不要加入结果集
if (p->right) {//出栈的时候如果有右节点,则将右节点入栈,然后一直找到最左节点
nodeStack.push(p->right);
left = p->right->left;
}
}
}
//在中序遍历结果集中找出最小差
int ans = abs(inorder[1] - inorder[0]);
for (int i = 2; i < inorder.size(); i++) {
if (abs(inorder[i] - inorder[i-1]) < ans) {
ans = abs(inorder[i] - inorder[i-1]);
}
}
return ans;
}
};
还望记住二叉搜索树这个特性,同时中序遍历的代码也应该做到十分清楚