二叉树:搜索树的最小绝对差
利用二叉搜索树的特性搞起!
530.二叉搜索树的最小绝对差给你一棵所有节点为非负值的二叉搜索树 , 请你计算树中任意两节点的差的绝对值的最小值 。
示例:
文章插图
提示:树中至少有 2 个节点 。
思路题目中要求在二叉搜索树上任意两节点的差的绝对值的最小值 。
「注意是二叉搜索树」 , 二叉搜索树可是有序的 。
遇到在二叉搜索树上求什么最值啊 , 差值之类的 , 就把它想成在一个有序数组上求最值 , 求差值 , 这样就简单多了 。
递归那么二叉搜索树采用中序遍历 , 其实就是一个有序数组 。
【二叉树:搜索树的最小绝对差】「在一个有序数组上求两个数最小差值 , 这是不是就是一道送分题了 。 」
最直观的想法 , 就是把二叉搜索树转换成有序数组 , 然后遍历一遍数组 , 就统计出来最小差值了 。
代码如下:
class Solution {private:vector
以上代码是把二叉搜索树转化为有序数组了 , 其实在二叉搜素树中序遍历的过程中 , 我们就可以直接计算了 。
需要用一个pre节点记录一下cur节点的前一个节点 。
如图:
文章插图
一些同学不知道在递归中如何记录前一个节点的指针 , 其实实现起来是很简单的 , 大家只要看过一次 , 写过一次 , 就掌握了 。
代码如下:
class Solution {private:int result = INT_MAX;TreeNode* pre;void traversal(TreeNode* cur) {if (cur == NULL) return;traversal(cur->left);// 左if (pre != NULL){// 中result = min(result, cur->val - pre->val);}pre = cur; // 记录前一个traversal(cur->right);// 右}public:int getMinimumDifference(TreeNode* root) {traversal(root);return result;}};
是不是看上去也并不复杂!
迭代看过这两篇二叉树:听说递归能做的 , 栈也能做, 二叉树:前中后序迭代方式的写法就不能统一一下么? 文章之后 , 不难写出两种中序遍历的迭代法 。
下面我给出其中的一种中序遍历的迭代法 , 代码如下:
class Solution {public:int getMinimumDifference(TreeNode* root) {stack st;TreeNode* cur = root;TreeNode* pre = NULL;int result = INT_MAX;while (cur != NULL || !st.empty()) {if (cur != NULL) { // 指针来访问节点 , 访问到最底层st.push(cur); // 将访问的节点放进栈cur = cur->left;// 左} else {cur = st.top();st.pop();if (pre != NULL) {// 中result = min(result, cur->val - pre->val);}pre = cur;cur = cur->right;// 右}}return result;}};
总结「遇到在二叉搜索树上求什么最值 , 求差值之类的 , 都要思考一下二叉搜索树可是有序的 , 要利用好这一特点 。 」
同时要学会在递归遍历的过程中如何记录前后两个指针 , 这也是一个小技巧 , 学会了还是很受用的 。
后面我将继续介绍一系列利用二叉搜索树特性的题目 。
「就酱 , 感觉学到了 , 就转发给身边需要的同学吧」
推荐阅读
- 传统1/10大小 七彩虹发布最小的mini SSD硬盘:性能首次公开
- Apple Fitness+播放列表现可在Apple Music搜索上找到
- 世界最小手机发售:31克 打火机那么大
- 号称世界最小手机!Zanco Tiny T2 发售
- 苹果正在研发的搜索引擎能干的过谷歌吗?
- 项目实战 | 记一次对某猥琐PHP后门的爆菊
- 搜海信出华为 华为智慧屏截了“海信”
- 谷歌搜索的灵魂!BERT模型的崛起与荣耀
- 谷歌遭美国38州联合起诉非法垄断市场,称其侵害网络搜索与使用广告业务剥夺消费者权益
- 北京地铁列车将用上5G技术,最小间隔将缩短10%