Leetcode 783二叉搜索树节点最小距离

该博客讨论了Leetcode 783问题,即如何找到二叉搜索树中任意两节点间的最小距离。博主分享了一种错误的递归解法,并指出正确解决方案应利用二叉搜索树中序遍历后的有序性,通过计算相邻节点差值来找到最小值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;
}
};

还望记住二叉搜索树这个特性,同时中序遍历的代码也应该做到十分清楚

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值