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

26_二叉搜索树的最小绝对差

时间:2023-12-27 21:45:53浏览次数:43  
标签:pre 26 二叉 搜索 result null root stack

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

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

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

示例 1:

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

示例 2:

img
输入:root = [1,0,48,null,null,12,49]
输出:1

【思路】

题目要求在二叉搜索树上任意两节点的差的绝对值的最小值。

注意是二叉搜索树,二叉搜索树是有序的。遇到在二叉搜索树上求最值、差值之类的,就把它想成在一个有序数组上求最值、差值,这样就简答多了。

class Solution {
    TreeNode pre;// 记录上一个遍历的结点
    int result = Integer.MAX_VALUE;
    public int getMinimumDifference(TreeNode root) {
       if(root==null)return 0;
       traversal(root);
       return result;
    }
    public void traversal(TreeNode root){
        if(root==null)return;
        //左
        traversal(root.left);
        //中
        if(pre!=null){
            result = Math.min(result,root.val-pre.val);
        }
        pre = root;
        //右
        traversal(root.right);
    }
}
class Solution {
    public int getMinimumDifference(TreeNode root) {
        Stack<TreeNode> stack = new Stack<>();
        TreeNode pre = null;
        int result = Integer.MAX_VALUE;

        if(root != null)
            stack.add(root);
        while(!stack.isEmpty()){
            TreeNode curr = stack.peek();
            if(curr != null){
                stack.pop();
                if(curr.right != null)
                    stack.add(curr.right);
                stack.add(curr);
                stack.add(null);
                if(curr.left != null)
                    stack.add(curr.left);
            }else{
                stack.pop();
                TreeNode temp = stack.pop();
                if(pre != null)
                    result = Math.min(result, temp.val - pre.val);
                pre = temp;
            }
        }
        return result;
    }
}

标签:pre,26,二叉,搜索,result,null,root,stack
From: https://www.cnblogs.com/codingbao/p/17931499.html

相关文章

  • 25_验证二叉搜索树
    98.验证二叉搜索树给你一个二叉树的根节点root,判断其是否是一个有效的二叉搜索树。有效二叉搜索树定义如下:节点的左子树只包含小于当前节点的数。节点的右子树只包含大于当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。示例1:输入:root=[2,1,3]输出......
  • 代码随想录算法训练营第十五天 | 层序遍历 ,226.翻转二叉树,101.对称二叉树
    一、二叉树层序遍历题目链接:LeetCode102.二叉树的层序遍历LeetCode107.二叉树的层序遍历IILeetCode199.二叉树的右视图LeetCode637.二叉树的层平均值LeetCode429.N叉树的层序遍历LeetCode515.在每个树行中找最大值LeetCode116.填充每个节点的下一个右侧节......
  • [LeetCode Hot 100] LeetCode102. 二叉树的层序遍历
    题目描述思路方法一:递归/***Definitionforabinarytreenode.*publicclassTreeNode{*intval;*TreeNodeleft;*TreeNoderight;*TreeNode(){}*TreeNode(intval){this.val=val;}*TreeNode(intval,TreeNodelef......
  • [LeetCode Hot 100] LeetCode543. 二叉树的直径
    题目描述思路所谓二叉树的直径,就是左右子树的最大深度之和。方法一:/***Definitionforabinarytreenode.*publicclassTreeNode{*intval;*TreeNodeleft;*TreeNoderight;*TreeNode(){}*TreeNode(intval){this.val=va......
  • [LeetCode Hot 100] LeetCode104. 二叉树的最大深度
    题目描述思路熟练掌握二叉树的遍历算法方法一:层序遍历(迭代)+计数/***Definitionforabinarytreenode.*publicclassTreeNode{*intval;*TreeNodeleft;*TreeNoderight;*TreeNode(){}*TreeNode(intval){this.val=val;......
  • [LeetCode Hot 100] LeetCode110. 平衡二叉树
    题目描述思路LeetCode104.二叉树的最大深度变种方法一:后序遍历(递归、dfs)/***Definitionforabinarytreenode.*publicclassTreeNode{*intval;*TreeNodeleft;*TreeNoderight;*TreeNode(){}*TreeNode(intval){this.......
  • [LeetCode Hot 100] LeetCode111. 二叉树的最小深度
    题目描述思路二叉树的最小深度就是第一个叶子节点所在的层数方法一:前序遍历(递归、dfs)/***Definitionforabinarytreenode.*publicclassTreeNode{*intval;*TreeNodeleft;*TreeNoderight;*TreeNode(){}*TreeNode(intva......
  • [LeetCode Hot 100] LeetCode94. 二叉树的中序遍历
    题目描述思路熟练掌握迭代和递归的代码。递归:额外写一个函数voidinOrder(TreeNodenode,Listres)迭代:令cur=root,一直往左子树找,找到最后一个左子节点,当cur为空,就开始处理栈顶元素(将栈顶元素加入结果集),随后将cur设置为右子节点,继续执行以上操作。方法一:递归/***......
  • [LeetCode Hot 100] LeetCode144. 二叉树的前序遍历
    题目描述思路熟练掌握迭代和递归的代码。递归代码:额外写一个函数voidpreOrder(TreeNodenode,Listres)迭代代码:会用到数据结构——栈。先入栈当前节点的右子节点,再入栈左子节点。方法一:递归/***Definitionforabinarytreenode.*publicclassTreeNode{*......
  • [LeetCode Hot 100] LeetCode145. 二叉树的后序遍历
    题目描述思路递归:额外写一个函数voidpostOrder(TreeNodenode,Listres)迭代:前序遍历:根---左---右将前序遍历改造成:根---右---左然后反转根右左为:左---右---根,即为后序遍历优化一下:while(!stack.isEmpty()){ TreeNodenode=stack.pop(); res.addFirst(node.......