二叉搜索树节点最小距离(C++)

本文探讨了一道算法题目,涉及二叉搜索树的性质。给出的解决方案是通过递归遍历二叉搜索树,收集所有节点值,然后排序找到最小差值。这种方法不仅适用于二叉搜索树,还可应用于一般二叉树,并能处理重复节点值的情况。解题思路清晰,代码实现简洁,适合初学者理解与练习。
摘要由CSDN通过智能技术生成

最近在学算法分析与设计,第一次作业的习题2是下面的题目,做完之后来分享一下。
题目来源:leetcode-二叉搜索树节点最小距离(序号:783)

题目描述:
给定一个二叉搜索树的根节点root,返回树中任意两节点的差的最小值。

示例:
输入:root = [4, 2, 6, 1, 3, null, null]
输出:1
解释:注意,root是根节点对象(TreeNode),而不是数组。

注意:

  1. 二叉树的大小范围在2到100。
  2. 二叉树总是有效的,每个节点的值都是整数,且不重复。

解题思路:
首先,使用一个叫作arr的vector保存所有节点的val(通过递归);然后用sort函数(定义在algorithm头文件中)将arr中的元素按从小到大的顺序排列(这里这么做的理由是,按照从小到大的顺序排列后,最小的差只可能出现在相邻元素之差中,而不可能出现在非相邻元素之差中,可以减少计算次数);之后计算相邻元素的差,并将其保存在temp中;最后再次用sort函数将temp中的元素按从小到大的顺序排列。此时,temp中的第一个元素即为任意两节点的差的最小值。

代码如下:

/*
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:
    vector<int> arr;
    vector<int> temp;
    void init(TreeNode* root) {
        if(root == NULL)
            return;
        else
            arr.push_back(root->val);
        if(root->left != NULL)
            init(root->left);
        if(root->right != NULL)
            init(root->right);
    }
    int minDiffInBST(TreeNode* root) {
        init(root);
        sort(arr.begin(), arr.end());
        for(int i = 0; i < arr.size() - 1; i++)
            temp.push_back(arr[i + 1] - arr[i]);
        sort(temp.begin(), temp.end());
        return temp[0];
    }
};

解后反思:该代码适用于任意二叉树(而不只是二叉搜索树),并且允许节点数值重复。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值