最近在学算法分析与设计,第一次作业的习题2是下面的题目,做完之后来分享一下。
题目来源:leetcode-二叉搜索树节点最小距离(序号:783)
题目描述:
给定一个二叉搜索树的根节点root,返回树中任意两节点的差的最小值。
示例:
输入:root = [4, 2, 6, 1, 3, null, null]
输出:1
解释:注意,root是根节点对象(TreeNode),而不是数组。
注意:
- 二叉树的大小范围在2到100。
- 二叉树总是有效的,每个节点的值都是整数,且不重复。
解题思路:
首先,使用一个叫作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];
}
};
解后反思:该代码适用于任意二叉树(而不只是二叉搜索树),并且允许节点数值重复。