首页 > 编程语言 >代码随想录算法训练营第18天 | 二叉搜索树进阶

代码随想录算法训练营第18天 | 二叉搜索树进阶

时间:2024-07-23 15:31:59浏览次数:17  
标签:map TreeNode 进阶 val int 18 随想录 vec root

2024年7月20日

题530. 二叉搜索树的最小绝对差
使用递归获取中序遍历,然后遍历一遍vector即可得到结果。

import java.util.*;

class Solution {

    Vector<Integer> vec;

    public int getMinimumDifference(TreeNode root) {
        //首先得到中序遍历的结果
        vec = new Vector<>();
        digui(root.left);
        vec.add(root.val);
        digui(root.right);
        int minD = Integer.MAX_VALUE;
        for(int i=0;i<vec.size()-1;i++){
            if(minD>vec.get(i+1)-vec.get(i)){
                minD = vec.get(i+1)-vec.get(i);
            }
        }
        return minD;
    }

    public void digui(TreeNode root){
        if(root==null){
            return;
        }
        digui(root.left);
        vec.add(root.val);
        digui(root.right);
    }   
}

题501. 二叉搜索树中的众数
易错,注意最后遍历map是要找的是频率的最大值,然后依据频率来找key,赋值时不要混淆

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
import java.util.*;

class Solution {

    HashMap<Integer, Integer> map = new HashMap<>();

    public int[] findMode(TreeNode root) {
        
        digui(root.left);
        map.put(root.val,map.getOrDefault(root.val,0)+1);
        digui(root.right);
        //找出map中value最多的那几个key返回即可
        int maxV = -1;
        for(int i:map.keySet()){
            if(map.get(i)>maxV){
                maxV=map.get(i);
            }
        }
        ArrayList<Integer> list = new ArrayList<>();
        for(int i:map.keySet()){
            if(map.get(i)==maxV){
                list.add(i);
            }
        }
        int[] res = new int[list.size()];
        for(int i=0;i<list.size();i++){
            res[i] = list.get(i);
        }
        return res;
    }

    public void digui(TreeNode root){
        if(root==null){
            return;
        }else{
            digui(root.left);
            map.put(root.val,map.getOrDefault(root.val,0)+1);
            digui(root.right);
            return;
        }
    }
}

题236. 二叉树的最近公共祖先
注意记忆回溯模板,也就是给一个节点,记录root到其的路径的板子

import java.util.*;

class Solution {

    Vector<TreeNode> vec1;
    Vector<TreeNode> vec2; 
    int flag1=0;
    int flag2=0;

    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        //回溯,用path存储两个节点的路径,然后比较,如果第n个不一样了,那么n-1就是答案
        //中序遍历
        vec1 = new Vector<>();
        vec2 = new Vector<>();
        if(root.val==p.val && root.val==q.val){
            return root;
        }
        digui1(root,p);
        digui2(root,q);

        TreeNode pre = root;
        for(int i=0;i<vec1.size()&&i<vec2.size();i++){
            if(vec1.get(i).val==vec2.get(i).val){
                pre = vec1.get(i);
                continue;
            }else{
                break;
            }
        }
        return pre;

    }

    public void digui1(TreeNode root,TreeNode p){
        if(flag1==1){
            return;
        }
        if(root==null){
            return;
        }
        vec1.add(root);
        if(root.val==p.val){
            flag1=1;
            return;
        }else{
            digui1(root.left,p);
            digui1(root.right,p);
        }
        if(flag1==0){
            vec1.remove(vec1.size()-1);
        }
        return;
    }

    public void digui2(TreeNode root,TreeNode q){
        if(flag2==1){
            return;
        }
        if(root==null){
            return;
        }
        vec2.add(root);
        if(root.val==q.val){
            flag2=1;
            return;
        }else{
            digui2(root.left,q);
            digui2(root.right,q);
        }
        if(flag2==0){
            vec2.remove(vec2.size()-1);
        }
        
        return;
    }
}

标签:map,TreeNode,进阶,val,int,18,随想录,vec,root
From: https://www.cnblogs.com/hailicy/p/18318523

相关文章

  • # 代码随想录算法训练营第38天 | 01背包问题:1049.最后一块石头的重量II(最多能装多少)、
    1049.最后一块石头的重量IIhttps://leetcode.cn/problems/last-stone-weight-ii/代码随想录https://programmercarl.com/1049.最后一块石头的重量II.html#算法公开课494.目标和https://leetcode.cn/problems/target-sum/description/代码随想录https://programmercarl.com......
  • 代码随想录day7 | 454 四数相加|| 383 赎金信 15 三数之和 18 四数之和
    454四个数相加==0funcfourSumCount(nums1[]int,nums2[]int,nums3[]int,nums4[]int)int{ //1.用哈希表存储nums1和nums2两者之和的所有可能情况 //2.遍历nums3和nums4两者之和的相反数,如果在哈希表中存在,则结果加上哈希表中的值 //3.返回结果 sum1:......
  • STM32F429IGT6 STMCubeMX PWM 控制 180 舵机
    设置PWM对应引脚PA2![[QQ_1721613625998.png]]定时器2受APB1控制![[QQ_1721613709674.png]]配置时钟为72MHZ![[QQ_1721613757231.png]]HAL库定义PWM/*TIM2initfunction*/voidMX_TIM2_Init(void){/*USERCODEBEGINTIM2_Init0*//*USERCODEENDTI......
  • 算法-代码随想录-哈希表
    有效的字母异位词思路:数组作为一个简单的哈希表,可以用来记录字符串中每个字符出现的次数。可以设置一个数组,第一轮遍历s中的字符,字符每出现一次,在数组对应位置+1。第二轮遍历t中的字符,字符每出现一次,在数组对应位置-1。最后遍历作为哈希表的数组,如果都为0,则说明每个字符出现的......
  • python进阶---闭包与装饰器
    一、闭包        在Python中,闭包是指一个函数内部定义的函数,这个内部函数可以访问并修改其外部函数的局部变量,即使外部函数已经执行完毕。闭包可以通过多层函数嵌套来实现。    闭包的三要素:    1、外部函数嵌套内部函数    2、外部函数返......
  • 「代码随想录算法训练营」第十八天 | 二叉树 part8
    669.修剪二叉搜索树题目链接:https://leetcode.cn/problems/trim-a-binary-search-tree/题目难度:中等文章讲解:https://programmercarl.com/0669.修剪二叉搜索树.html视频讲解:https://www.bilibili.com/video/BV17P41177ud?share_source=copy_web题目状态:没有思路,看题解过......
  • IEC 61850 样本值 SavPDU 类型的 pyasn1 数据结构是否正确?
    我是使用pyasn1的新手,正在尝试按照Berkeley发布的PyASN1程序员手册文档IEC61850-9-2第8.5.2节表14将SEQUENCE类型转换为python类模型SavPdu的编码定义为SavPdu::=SEQUENCE{noASDU[0]IMPLICITINTEGER(1..65535),......
  • Ubuntu18.04 安装 Cuckoo Sandbox (第三部分 安装沙盒遇到部分问题)
    Ubuntu18.04安装CuckooSandbox(第三部分安装沙盒遇到部分问题)0x00遇到的相关问题我们将一个二进制可执行文件传入cucko沙盒进行测试,如果安装正常,可以看到vitrualbox中win7执行该程序实现的效果。同时左侧的behavioralanalysis可以看到行为分析,但是一开始没有安装......
  • 【笔记】生成函数 · 进阶(EGF)
    写在前面本文除了例题@.1P4389付公主的背包使用OGF其她的均为EGF0约定0.1一些形象的表达收缩:指一个式子由比较复杂的形式变简单。本文中大概率就是指一个生成函数用封闭形式来表达;多项式的平移:对于任意一个多项式\(A(x)\),向左平移\(m\)位指\(\left(A(x)-\s......
  • EXCEL初级入门--(第四章 函数进阶学习)-中
    文章目录(十四)MatchVlookup应用对比Match(十五)IndexMatch多条件应用案例Index(十六)IndexMatch数组嵌套IndexMatch(十七)唯一Subtotal唯一的筛选函数Subtotal(十八)Sumproduct函数应用Sumproduct(十九)条件求和函数1、sum2、sumif3、sumifs(二十)条件计......