首页 > 其他分享 >LeetCode530. 二叉搜索树的最小绝对差

LeetCode530. 二叉搜索树的最小绝对差

时间:2024-07-28 21:39:30浏览次数:12  
标签:pre 结点 cur root 二叉 搜索 result LeetCode530 vec

题目链接:https://leetcode.cn/problems/minimum-absolute-difference-in-bst/description/

题目叙述:

给你一个二叉搜索树的根节点 root ,返回 树中任意两不同节点值之间的最小差值 。

差值是一个正数,其数值等于两值之差的绝对值。

示例 1:

输入:root = [4,2,6,1,3]
输出:1

示例 2:

输入:root = [0]
输出:[0]

提示:

树中节点的数目在范围 [1, 10^4] 内
-10^5 <= Node.val <= 10^5

进阶:你可以不使用额外的空间吗?(假设由递归产生的隐式调用栈的开销不被计算在内)

思路:

我们可以利用二叉搜索树的性质,因为二叉搜索树的左子树的结点值最小,中间结点其次,右子树的结点值最大,因此我们可以采用中序遍历,将结点的值一次存入数组中,最后数组一定是个有序的

序列,我们只需要对比相邻两项之差的绝对值的最小值即可。

代码:

class Solution {
private:
	//创建全局变量vec作为数组存储所有结点
	vector<int> vec;
	void traversal(TreeNode* root) {
		if (root == NULL) return;
		traversal(root->left);
		//中序遍历,将结点放入数组中
		vec.push_back(root->val);
		traversal(root->right);
	}
public:
	int getMinimumDifference(TreeNode* root) {
		vec.clear();
		//得到的数组是一个有序的数组
		traversal(root);
		if (vec.size() < 2) return 0;
		int result = INT_MAX;
		//因为这个数组是有序的数组,所以我们只需要比较相邻两个结点
		for (int i = 1; i < vec.size(); i++) {
			//找出最小的节点之差
			result = min(result, vec[i] - vec[i - 1]);
		}
		return result;
	}
};

进阶

这题我们还可以不使用额外的数组空间,我们可以直接使用pre指针,存储上一个结点遍历的值,直接对比就行了

上代码:

class Solution {
public:
    //作为结果
    int result=INT_MAX;
    //用于存储上次遍历的结点
    TreeNode* pre=NULL;
    void traversal(TreeNode*cur){
        if(cur==NULL) return;
        //递归处理左子树
        traversal(cur->left);
        //先对pre判空
        if(pre!=NULL) result=min(result,cur->val-pre->val);
        //更新pre的值
        pre=cur;
        //递归处理右子树
        traversal(cur->right);
    }
    int getMinimumDifference(TreeNode* root) {
        traversal(root);
        return result;
    }
};

迭代法

递归法能做的,迭代法也能做!以下我给出中序遍历的迭代法

class Solution {
public:
    int getMinimumDifference(TreeNode* root) {
        stack<TreeNode*> 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;
    }
};

总结:

遇到在二叉搜索树上求什么最值,求差值之类的,都要思考一下二叉搜索树可是有序的,要利用好这一特点。

同时要学会在递归遍历的过程中如何使用两个指针来遍历,这个技巧很好用

标签:pre,结点,cur,root,二叉,搜索,result,LeetCode530,vec
From: https://www.cnblogs.com/Tomorrowland/p/18328874

相关文章

  • LeetCode654. 最大二叉树
    题目链接:https://leetcode.cn/problems/maximum-binary-tree/description/题目叙述给定一个不重复的整数数组nums。最大二叉树可以用下面的算法从nums递归地构建:创建一个根节点,其值为nums中的最大值。递归地在最大值左边的子数组前缀上构建左子树。递归地在最大......
  • LeetCode700. 二叉搜索树中的搜索
    题目链接:https://leetcode.cn/problems/search-in-a-binary-search-tree/description/题目叙述:给定二叉搜索树(BST)的根节点root和一个整数值val。你需要在BST中找到节点值等于val的节点。返回以该节点为根的子树。如果节点不存在,则返回null。示例1:输入:root=[1......
  • 如何在实际应用中利用B树进行搜索
    关注我,持续分享逻辑思维&管理思维&面试题;可提供大厂面试辅导、及定制化求职/在职/管理/架构辅导;推荐专栏《10天学会使用asp.net编程AI大模型》,目前已完成所有内容。一顿烧烤不到的费用,让人能紧跟时代的浪潮。从普通网站,到公众号、小程序,再到AI大模型网站。干货满满。学成后可......
  • 数据结构-二叉树、堆、图
    一、线索二叉树规律:在有n个节点的链式二叉树中必定存在n+1个空指针链式二叉树中有很多的空指针,可以让这些空指针指向前一个节点\后一个节点,从而在有序遍历(中序遍历)二叉树时,不需要使用递归而通过循环即可以完成,并且效率要比递归快得多一定是搜索二叉树线索二叉树的结构typ......
  • LeetCode222.完全二叉树的节点个数
    题目链接:https://leetcode.cn/problems/count-complete-tree-nodes/description/题目叙述给你一棵完全二叉树的根节点root,求出该树的节点个数。完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该......
  • 【无线充电车辆路线和速度预测】使用随机搜索优化方法同时具有路由和速度分配的模型研
    ......
  • 【无线充电车辆路线和速度预测】使用随机搜索优化方法同时具有路由和速度分配的模型研
    ......
  • 数据结构——链式二叉树(C语言版)
    链式二叉树的结构⽤链表来表⽰⼀棵⼆叉树,即⽤链来指⽰元素的逻辑关系。通常的⽅法是链表中每个结点由三个域组成,数据域和左右指针域,左右指针分别⽤来给出该结点左孩⼦和右孩⼦所在的链结点的存储地址。                                ......
  • 二分搜索
    二分搜索2024年7月25日21:27   正常二分思想重点是遇到不同的数怎么定边界,怎么记录答案。特殊情况:没有数字或者只有一个数,直接判断返回先定一个ans=-1用于记录答案,l、r记录左右边界看中点数值,比target小,说明比target的的数字在右边,l=mid+1比target大,ans=mid,还需......
  • 利用Elasticsearch实现地理位置、城市搜索服务
    最近用到一些简单的地理位置查询接口,基于当前定位获取用户所在位置信息(省市区),然后基于该信息查询当前区域的......提供服务。然后就自己研究了下GIS,作为一个程序员。自己能不能实现这个功能呢?答案当然是可以。立即开干。思路:找到数据,写入数据库,利用Elasticsearch强大的搜索能力......