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

最近在学算法分析与设计,第一次作业的习题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];
    }
};

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

你可能感兴趣的:(笔记)