写在前面
本专栏专注于分析与讲解【面试经典150】算法,两到三天更新一篇文章,欢迎催更……
专栏内容以分析题目为主,并附带一些对于本题涉及到的数据结构等内容进行回顾与总结,文章结构大致如下,部分内容会有增删:
- Tag:介绍本题牵涉到的知识点、数据结构;
- 题目来源:贴上题目的链接,方便大家查找题目并完成练习;
- 题目解读:复述题目(确保自己真的理解题目意思),并强调一些题目重点信息;
- 解题思路:介绍一些解题思路,每种解题思路包括思路讲解、实现代码以及复杂度分析;
- 知识回忆:针对今天介绍的题目中的重点内容、数据结构进行回顾总结。
Tag
【二叉搜索树】【中序遍历】
题目来源
![](https://img-blog.csdnimg.cn/img_convert/7f0e2da438c7c87fb25f737bd4d635e1.png)
解题思路
方法一:中序遍历
二叉搜索树的中序遍历得到的值序列是递增有序的。在有序序列中两个元素之差绝对值的最小值一定是在两个相邻的元素之间。
于是有两条思路,一是先对二叉搜索树进行中序遍历记录遍历的值,再遍历子序列找出相邻元素之差绝对值的最小值。二是边遍历边统计相邻元素之差的最小值。
二叉树的中序遍历利用递归比较容易实现,我们在输出中序遍历的节点时可以直接计算当前节点与相邻的上一个节点之间差值的绝对值最小值。见代码。
代码
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
void dfs(TreeNode* root, int& pre, int& res) {
if (root == nullptr) return;
dfs(root->left, pre, res);
if (pre == -1) {
pre = root->val;
}
else {
res = min(res, root->val - pre);
pre = root->val;
}
dfs(root->right, pre, res);
}
int getMinimumDifference(TreeNode* root) {
int res = INT_MAX, pre = -1;
dfs(root, pre, res);
return res;
}
};
复杂度分析
时间复杂度: O ( n ) O(n) O(n), n n n 为二叉搜索树节点的个数。每个节点在中序遍历时都会被访问且只会被访问一次。
空间复杂度: O ( n ) O(n) O(n),最坏的情况下二叉搜索树会退化成一条链,因此空间复杂度为 O ( n ) O(n) O(n)。
写在最后
如果您发现文章有任何错误或者对文章有任何疑问,欢迎私信博主或者在评论区指出 💬💬💬。
如果大家有更优的时间、空间复杂度的方法,欢迎评论区交流。
最后,感谢您的阅读,如果有所收获的话可以给我点一个 👍 哦。