代码随想录算法训练营第18天|加油!!

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

题目链接/文章讲解: 代码随想录

代码随想录

题目 需要返回二叉树符合某一特性(boolean)或者返回二叉树里面某一个结点数值(int),或者遍历部分二叉树,沿着某一条方向,就需要返回值。本题需要遍历整颗二叉树,而且是用全局变量记录最小值,就不需要返回值。

代码

   TreeNode pre = null;
    int MinAbsolute = Integer.MAX_VALUE;
    public int getMinimumDifference(TreeNode root) {
        getMin(root);
        return MinAbsolute;
    }
    public void getMin(TreeNode node){
        if(node==null)return;
        getMin(node.left);
        if(pre!=null){
            MinAbsolute = Math.min(MinAbsolute,Math.abs(node.val-pre.val));
        }
        pre=node;
        getMin(node.right);
    }

501.二叉搜索树中的众数

 第一想法

根绝二叉搜索树,设置全局变量Map(key = 元素结点 ,value = 重复次数)。遍历将计算各节点的频次,将map集合按照降序排列,返回最大值。

代码随想录

有点像动态规划。如果频率值count等于maxCount,那么就加入结果集。

count大于maxCount,则以前的值失效,清空结果集,更新maxCount。

我第一次疑惑的点在于我想的是判断count大于等于maxCount,那么就加压入结果集(结构为堆),记录maxCount的数量,也就是众数的个数,弹出相对应数量的元素就行。这么做非常麻烦。

这个双指针妙的地方主要还是在思想,类似于动态规划的状态转移,并不等到全部遍历完才确定maxCount,而是每次遍历都确定目前已遍历序列的maxCount,因为下次遍历是在目前序列的基础上,所以下次maxCount的状态可以由目前转移过去,总的来说就是一个状态迭代的思想。 状态迭代的思想很关键,总是能确定局部最优解,在处理海量数据以及分布式数据时能实时给出局部最优结果,并且有较低的时间复杂度。

将ArrayLIst转换为数组:   return result.stream().mapToInt(k->k).toArray();

代码

class Solution {
    TreeNode pre = null;
    int count=0,maxCount = 0;
    ArrayList<Integer> result = new ArrayList<>();
    public int[] findMode(TreeNode root) {
        getMode(root);
        return result.stream().mapToInt(k->k).toArray();
    }
    public void getMode(TreeNode root){
        if(root==null)return;
        //左结点
        getMode(root.left);
        //中结点,处理逻辑
        if(pre==null)count=1;
        else if (pre.val==root.val) {
            count++;
        }else{
            count=1;
        }
        pre = root;
        if(count==maxCount)result.add(root.val);
        else if(count>maxCount){
            maxCount = count;
            result.clear();
            result.add(root.val);
        }
        //右结点
        getMode(root.right);
    }
}

236.二叉树的最近公共祖先

代码随想录

此题从下往上遍历,参考求高度,所以选用后序遍历,根据左右结点值来处理中间节点。

最容易一个情况的公共节点:其左节点包含p或q,右结点包含p或q,那么这就是p或q的公共结点。

返回值和参数值都为TreeNode,因为题目要求我们返回公共节点,所以是有返回值的。

一旦有了返回值,左节点和右节点一定是有接收值的,不能立刻返回,要等左右逻辑处理完后才能返回。我们此时就需要遍历整棵树了。

left = 递归函数(root->left);  // 左
right = 递归函数(root->right); // 右
left与right的逻辑处理;         // 中

单层处理逻辑:
1. 左,右均为空,返回空

2. 左,右均不为空,那么一边一个,返回root

3. 左为空,返回右边

4. 右为空,返回左边。

代码

class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        if (root == null) return null;
        if (root == p || root == q) return root;
        TreeNode leftNode = lowestCommonAncestor(root.left, p, q);
        TreeNode rightNode = lowestCommonAncestor(root.right, p, q);
        if (leftNode == null && rightNode == null) return null;
        else if (leftNode == null && rightNode != null) return rightNode;
        else if (leftNode != null && rightNode == null) return leftNode;
        else return root;
    }
}

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
代码随想录算法训练营是一个优质的学习和讨论平台,提供了丰富的算法训练内容和讨论交流机会。在训练营中,学员们可以通过观看视频讲解来学习算法知识,并根据讲解内容进行刷题练习。此外,训练营还提供了刷题建议,例如先看视频、了解自己所使用的编程语言、使用日志等方法来提高刷题效果和语言掌握程度。 训练营中的讨论内容非常丰富,涵盖了各种算法知识点和解题方法。例如,在第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 ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值