算法通关村——二分查找在二叉树中的应用

这篇具有很好参考价值的文章主要介绍了算法通关村——二分查找在二叉树中的应用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 二叉搜索树中的搜索

二叉搜索树中的搜索
给定二叉搜索树(BST)的根节点 root 和一个整数值 val。
你需要在 BST 中找到节点值等于 val 的节点。 返回以该节点为根的子树。 如果节点不存在,则返回 null 。

1.1 递归

一开始以为很难,无从下手,但是题目已经规定了这是二叉搜索树,意味着将元素按照中序排列,就是一个有序的数组/链表,寻找目标val,有三种结果:

  1. 等于val,那么直接输出根节点
  2. 小于val,目标val在当前节点左边
  3. 大于val,目标在val右边
    public TreeNode searchBST(TreeNode root, int val) {
        if(root==null || val == root.val) return root;
        return val<root.val ? searchBST(root.left,val) : searchBST(root.right,val);
    }

1.2 迭代

思路都是一样的

 public TreeNode searchBST(TreeNode root, int val) {
       while(root!=null && val!=root.val){
          root= val< root.val?root.left:root.right;
       }
       return root;
    }

2. 验证二叉搜索树

98. 验证二叉搜索树
给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。
有效 二叉搜索树定义如下:
节点的左子树只包含 小于 当前节点的数。
节点的右子树只包含 大于 当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。

2.1 递归

官方的递归是重写了一个方法,先定义两个值,分别是最小的Integer和最大的Integer,那么这个节点的值一定是在这个范围内的,然后递归将子树的值分别和最小和最大的值比较,然后返回,只不过优点麻烦。
这里可以采取一个简便方法,将最小值先定义在外面,然后先对左子树递归调用 isValidBST,再判断当前节点值是否大于中序遍历的前一个节点的值,如果不大于,则返回 false,即不满足 BST 的条件。最后将当前节点的值赋给 pre 变量,并对右子树递归调用 isValidBST。

class Solution {
    // 里面会采用integer的最大值,会不通过
    long pre = Long.MIN_VALUE;
    public boolean isValidBST(TreeNode root) {
       if(root == null) return true;
       // 左子树元素不满足
       if(!isValidBST(root.left)){
           return false;
       }
        // 当前节点小于等于中序遍历的前一个节点
       if(root.val<= pre){
           return false;
       }
       pre = root.val;
       return isValidBST(root.right);
    }
}

2.2 迭代

二叉搜索树的中序遍历,如果能够满足条件,那么就是有序的,只需要判断当前的值是否小于之前节点的值。

    public boolean isValidBST(TreeNode root) {
       Deque<TreeNode> stack = new LinkedList<>();
       // 存储前一个节点元素值
       double inorder = -Double.MAX_VALUE;
        while(!stack.isEmpty() || root!=null){
            while(root!=null){
                stack.push(root);
                root=root.left;
            }
            root = stack.pop();
            if(root.val<=inorder){
                return false;
            }
            inorder = root.val;
            root=root.right;
        }
        return true;
    }

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

二叉搜索树的最小绝对差

给你一个二叉搜索树的根节点 root ,返回 树中任意两不同节点值之间的最小差值 。
差值是一个正数,其数值等于两值之差的绝对值。

3.1 递归

依然是先保留前一个节点的值,然后进行中序遍历,比较前一个值与当前值的差是否小于最小值,小于就替换。

class Solution {
    // 上一个节点的值
    int pre;
    // 结果
    int ans;
    public int getMinimumDifference(TreeNode root) {
      ans = Integer.MAX_VALUE;
      pre=-1;
        dfs(root);
        return ans;
    }

    public void dfs(TreeNode root){
        if(root==null){
            return;
        }
        // 左
        dfs(root.left);
        // 中
        if(pre == -1){
            pre = root.val;
        }else{
            ans = Math.min(ans,root.val-pre);
            pre=root.val;
        }
        // 右
        dfs(root.right);
    }
}

3.2 迭代,中序遍历

一开始就是想的迭代法,但是轮到自己做就有点绕,尤其是在类里定义变量,然后方法里面使用,做法都差不多。文章来源地址https://www.toymoban.com/news/detail-638793.html

class Solution {
    // 记录前一个节点
    TreeNode pre;
    Stack<TreeNode> stack;
    public int getMinimumDifference(TreeNode root) {
     if(root==null) return 0;
     TreeNode cur = root;
     stack = new Stack<>();
     int res = Integer.MAX_VALUE;
     while(cur!=null || !stack.isEmpty()){
         // 当前节点不为空
         if(cur!=null){
             stack.push(cur);
             // 左
             cur=cur.left;
             // 当前节点为空
         }else{
             cur=stack.pop();
             // 中
             if(pre!=null){
                 res=Math.min(res,cur.val-pre.val);
             }
             pre=cur;
             // 右
             cur=cur.right;
         }
     }

     return res;
    }
}

到了这里,关于算法通关村——二分查找在二叉树中的应用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 算法---二叉树中的最大路径和

    二叉树中的 路径 被定义为一条节点序列,序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点,且不一定经过根节点。 路径和 是路径中各节点值的总和。 给你一个二叉树的根节点 root ,返回其 最大路径和 。 示

    2024年02月11日
    浏览(30)
  • 【算法专题】二叉树中的深搜(DFS)

    深度优先遍历(DFS,全称为 Depth First Traversal),是我们树或者图这样的数据结构中常用的⼀种遍历算法。这个算法会尽可能深的搜索树或者图的分支,直到一条路径上的所有节点都被遍历完毕,然后再回溯到上一层,继续找⼀条路遍历。 在二叉树中,常见的深度优先遍历为

    2024年02月03日
    浏览(32)
  • LeetCode算法递归类—二叉树中的最大路径和

    目录 124. 二叉树中的最大路径和 - 力扣(LeetCode) 题解: 代码: 运行结果: 二叉树中的  路径  被定义为一条节点序列,序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中  至多出现一次  。该路径  至少包含一个  节点,且不一定经过根节点。 路径和

    2024年02月12日
    浏览(28)
  • 算法刷题Day 20 最大二叉树+合并二叉树+二叉搜索树中的搜索+验证二叉搜索树

    递归 递归 迭代 递归 迭代 遇到两个坑的地方: 递归的时候,不能光验证左子树的根节点小于当前根节点,右子树的根节点大于但当前根节点,别忘了左子树上的每一个节点都要求比根节点要小,右子树上的每一个节点都要求比根节点大。 根节点跟左(右)子树中的某一个节

    2024年02月16日
    浏览(31)
  • 算法训练day20Leetcode654最大二叉树617合并二叉树700二叉树中的1搜索98验证二叉搜索树

    https://leetcode.cn/problems/maximum-binary-tree/description/ 中序遍历递归,找到最大值然后作为根节点 凡是构造二叉树的题目都用前序遍历 (中左右) 为先构造中间节点,然后递归构造左子树和右子树。 确定递归函数的参数和返回值 参数传入的是存放元素的数组,返回该数组构造的二

    2024年01月21日
    浏览(32)
  • 【算法刷题day20】Leetcode:654. 最大二叉树、617.合并二叉树、700. 二叉搜索树中的搜索、98.验证二叉搜索树

    草稿图网站 java的Deque 题目: 654. 最大二叉树 解析: 代码随想录解析 解题思路 NLR的建树 代码 总结 暂无 题目: 617.合并二叉树 解析: 代码随想录解析 解题思路 如果都为root1, root2都为空,返回null;如果root1为空,root2不为空,返回root2;如果roo1不为空,root2为空,返回root

    2024年04月10日
    浏览(31)
  • 算法通关村——透彻理解二分查找

    假设现在有个数组里面有重复元素,并且按照增序排列,如果有相同元素,返回最左侧的第一个重复元素的位置。 核心思路也是比较简单了,当找到第一个重复的元素时候,记录位置,然后向左移动,左边的不是目标元素,就意味着左边没有重复的目标元素,然后+1就是目标

    2024年02月13日
    浏览(22)
  • leetcode: 1261: 在受污染的二叉树中查找元素

    给出一个满足下述规则的二叉树: root.val == 0 如果  treeNode.val == x  且  treeNode.left != null ,那么  treeNode.left.val == 2 * x + 1 如果  treeNode.val == x  且  treeNode.right != null ,那么  treeNode.right.val == 2 * x + 2 现在这个二叉树受到「污染」,所有的  treeNode.val  都变成了  -1 。 请你先

    2024年03月12日
    浏览(27)
  • 在二叉树中有两个结点m和n,若m是n的祖先,则使用后序遍历可以找到从m到n的路径。(解答思想)

    所谓 找到从m到n的路径 ,即辅助栈中存在从m到n的路径。 本文中树的访问顺序采用先序; 遇到元素先入栈,何时出栈输出则需要具体考虑; 以上图为例: 1、先序 : 进入m: m入栈,m出栈并输出 ;         进入m的左子树a:                  a入栈,a出栈并输出

    2024年02月04日
    浏览(39)
  • 算法刷题Day 21 二叉搜索树的最小绝对差+二叉搜索树中的众数+二叉树的最近公共祖先

    递归 递归中保存前一个节点的指针的方法,需要再学习,巩固一下 迭代 一下子就想到的方法:遍历一遍二叉搜索树,把各个节点的值存进哈希表里(节点值——键,出现频率——值),再遍历哈希表找众数 一般方法 既然是二叉搜索树,中序遍历就是有序的。有序的话,我

    2024年02月16日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包