代码随想录算法训练营day20

530_二叉搜索树的最小绝对差(看题解了)

给你一棵所有节点为非负值的二叉搜索树,请你计算树中任意两节点的差的绝对值的最小值。

示例:

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

提示:树中至少有 2 个节点。

算法思想:

1、二叉排序树,中序遍历后是一个递增有序数组,可以转化为数组之后操作。

2、中序遍历,设置一个全局变量指向当前节点的前驱节点,求差值。

代码:

class Solution {
    int ans = 100000;
    TreeNode pre = null;

    public void inorder(TreeNode root) {
        if (root == null)
            return;
        inorder(root.left);
        if (pre != null) {
            int temp = Math.abs(pre.val - root.val);
            if (temp < ans)
                ans = temp;
        }
        pre = root;
        inorder(root.right);
    }

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

        inorder(root);
        return ans;
    }
}

注意:

学会在递归中如何记录前一个节点。

题目:501_二叉搜索树中的众数(看了题解)

给定一个有相同值的二叉搜索树(BST),找出 BST 中的所有众数(出现频率最高的元素)。

假定 BST 有如下定义:

  • 结点左子树中所含结点的值小于等于当前结点的值
  • 结点右子树中所含结点的值大于等于当前结点的值
  • 左子树和右子树都是二叉搜索树

例如:

给定 BST [1,null,2,2],

501. 二叉搜索树中的众数

返回[2].

提示:如果众数超过1个,不需考虑输出顺序

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

#

算法思想:

注意利用线索二叉树的特性。

重复的数据是连续访问到的。因此只用定义一个变量 count,记录当前元素出现的次数。

如果当前元素为第一个元素,或者,当前元素不等于前驱节点,count 值置为1;

否则,即 当前节点等于前驱节点,count ++;

再依据当前节点的 count 值,判断是否更新众数。

如果当前 count== maxcount,

如果当前count > maxcount ,则需要更新所有众数,之前获得的众数被取代。清空 list,将当前节点加入 list,更新;

最后,手动把 ArrayList 转为 int[] ;

代码:

import javax.imageio.stream.ImageInputStream;
import java.util.ArrayList;

public class Solution2 {

    TreeNode pre = null;
    int count = 0, maxcount = 1;
    ArrayList<Integer> ans = new ArrayList<Integer>();

    public void inorder(TreeNode root) {
        if (root == null) return;
        inorder(root.left);
        //更新 count 值
        if (pre == null||root.val!=pre.val) count = 1;
        else count++;
        //找出众数
        if(count>maxcount){
            ans.clear();;
            ans.add(root.val);
            maxcount=count;
        }else if(count==maxcount){
            ans.add(root.val);
        }
        pre = root; //更新前驱指针
        inorder(root.right);


    }


    public int[] findMode(TreeNode root) {

        inorder(root);
        int list[] = new int[ans.size()];     //把 ArrayList 手动转数组
        for (int i = 0; i < ans.size(); i++) {
            list[i] = ans.get(i);
        }
        return list;

    }

    public static void main(String[] args) {


        TreeNode t1 = new TreeNode(1,null,null);
        int [] ans = new Solution2().findMode(t1);
        for (int i = 0; i < ans.length; i++) {
            System.out.println(ans[i]);

        }
    }
}

算法思想:

题目:236_二叉树的最近公共祖先(看了题解)

给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。

百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”

算法思想:

题目规定给定结点不同且一定有公共祖先结点。

采用计算型后序递归,递归终止条件1、结点为空,返回空;2、节点为p或q,返回p、或q。

退出时处理当前节点,若当前节点1、左子树和右子树返回值都不为空,返回当前节点;2、左子树不空返回左子树;3、右子树不用返回右子树。

代码:

public class Solution {
    //算法思想,后序遍历,遇到p、q 将结点返回,如果当前节点左右子树返回值都不为空,表示当前节点是pq公共祖先。
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        if(root==null) return null;
        if(root ==p||root==q) return root; //第一次访问节点,判断该节点是不是p、q若是则递归终止,返回结点
        TreeNode left = lowestCommonAncestor(root.left,p,q);
        TreeNode right = lowestCommonAncestor(root.right,p,q);
        if(left!=null&&right!=null) return root;  //退出该结点前判断该点是否左右子树都有返回值,若是,则该结点为公共父节点,返回
        else if(left!=null&&right==null) return left;
        else if(left==null&&right!=null) return right;
        else return null;
    }
}

  • 12
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
代码随想录算法训练营是一个优质的学习和讨论平台,提供了丰富的算法训练内容和讨论交流机会。在训练营中,学员们可以通过观看视频讲解来学习算法知识,并根据讲解内容进行刷题练习。此外,训练营还提供了刷题建议,例如先看视频、了解自己所使用的编程语言、使用日志等方法来提高刷题效果和语言掌握程度。 训练营中的讨论内容非常丰富,涵盖了各种算法知识点和解题方法。例如,在第14天的训练营中,讲解了二叉树的理论基础、递归遍历、迭代遍历和统一遍历的内容。此外,在讨论中还分享了相关的博客文章和配图,帮助学员更好地理解和掌握二叉树的遍历方法。 训练营还提供了每日的讨论知识点,例如在第15天的讨论中,介绍了层序遍历的方法和使用队列来模拟一层一层遍历的效果。在第16天的讨论中,重点讨论了如何进行调试(debug)的方法,认为掌握调试技巧可以帮助学员更好地解决问题和写出正确的算法代码。 总之,代码随想录算法训练营是一个提供优质学习和讨论环境的平台,可以帮助学员系统地学习算法知识,并提供了丰富的讨论内容和刷题建议来提高算法编程能力。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [代码随想录算法训练营每日精华](https://blog.csdn.net/weixin_38556197/article/details/128462133)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值