力扣-数据结构-21【算法学习day.92】

前言

###我做这类文章一个重要的目的还是给正在学习的大家提供方向(例如想要掌握基础用法,该刷哪些题?建议灵神的题单和代码随想录)和记录自己的学习过程,我的解析也不会做的非常详细,只会提供思路和一些关键点,力扣上的大佬们的题解质量是非常非常高滴!!!


习题

1.最深叶节点的最近公共祖先

题目链接: 1123. 最深叶节点的最近公共祖先 - 力扣(LeetCode)

题面:

代码:

java 复制代码
/**
 * 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;
 *     }
 * }
 */
class Solution {
    int maxdep = 0;
    TreeNode ans = null;
    int sum = 0;
    public TreeNode lcaDeepestLeaves(TreeNode root) {
        recursion2(root,0);
        // System.out.println(maxdep+"          "+sum);
        recursion(root,0);
        return ans;
    }
    public int recursion(TreeNode node,int dep){
        if(node==null){
            return 0;
        }
        if(node.left==null&&node.right==null){
            
            if(dep==maxdep){
                if(sum==1){
                    ans = node;
                    return 99999;
                }
                return 1;
            }
            return 0;
        }
        int l = recursion(node.left,dep+1);
        int r = recursion(node.right,dep+1);
        if((l+r)==sum){
            ans = node;
            return 99999;
        }
        return (l+r);
    }
    public void recursion2(TreeNode node,int dep){
        if(node==null){
            return;
        }
        if(node.left==null&&node.right==null){
            if(dep>maxdep){
                maxdep = dep;
                sum = 1;
            }else if(maxdep==dep){
                sum++;
            }
        }
        recursion2(node.left,dep+1);
        recursion2(node.right,dep+1);
    }
}

2.从二叉树一个节点到另一个节点的每一步的方向

题目链接: 2096. 从二叉树一个节点到另一个节点每一步的方向 - 力扣(LeetCode)

题面:

注意递归遍历树的时候别在参数拼接树,当树太大会OOM,用StringBuilder

代码:

java 复制代码
/**
 * 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;
 *     }
 * }
 */
class Solution {
    TreeNode linP = null;
    int startValue;
    int destValue;
    String start = "";
    String dest = "";
    public String getDirections(TreeNode root, int startValue, int destValue) {
        this.startValue = startValue;
        this.destValue = destValue;
        int sign = recursion2(root);
        if(sign==2){
            linP = root;
        }
        StringBuilder sb = new StringBuilder();
        recursion(linP,sb);
        // System.out.println(start+"           "+dest);
         int size = start.length();
            String ans = "";
            while(size>0){
                size--;
                ans+="U";
            }
        if(dest.equals("")){
            return ans;
        }
        if(start.equals("")){
            return dest;
        }
        return ans+dest;

    }
    public void recursion(TreeNode node,StringBuilder sb){
        if(!dest.equals("")&&!start.equals(""))return;
        if(node==null)return;
        if(node.val==startValue){
            start = sb.toString();
        }else if(node.val==destValue){
            dest = sb.toString();
        }
        recursion(node.left,sb.append("L"));
        sb.deleteCharAt(sb.length()-1);
        recursion(node.right,sb.append("R"));
        sb.deleteCharAt(sb.length()-1);
    }
    public int recursion2(TreeNode node){
        if(linP!=null)return 99999;
        if(node==null)return 0;
        int l = recursion2(node.left);
        int r = recursion2(node.right);
        if(node.val==startValue||node.val==destValue){
            int sum = l+r+1;
            if(sum==2){
                linP = node;
                return 9999;
            }
            return sum;
        }
        if((l+r)==2){
            linP = node;
            return 99999;
        }
        return l+r;
    }
}

后言

上面是数据结构相关的习题,下一篇文章会将其他相关的习题。

相关推荐
mldong2 小时前
一个 App,十三套后端:手机审批端 uni-jeeflow-app 开源了
java·架构
tqs_123453 小时前
MySQL RR隔离级别死锁|Gap间隙锁、临键锁,订单并发范围查询死锁根因方案
java
逆境不可逃3 小时前
Pi Agent 学习笔记:多个工具怎样并行执行
java
v_34836087623 小时前
Android native端 堆栈打印
android·算法
residual_fan3 小时前
【学术论文】航空发动机故障诊断智能体:基于持续对比强化学习的动态优化方法
人工智能·算法·数据挖掘·数据分析
小弥儿3 小时前
GitHub今日热榜 | 2026-09-15:AI 智能体与本地生成工具领跑
学习·开源
Flynt4 小时前
Java 27 升级实测:默认值动得比新特性多,有个老参数会让 JVM 直接起不来
java·jvm·后端
Bs_MoneyMagnet4 小时前
基于springboot+vue的个人健康管理系统的设计与实现 源码+文档
java·vue.js·spring boot·后端·vue3·springboot3·计算机毕业设计
susplus4 小时前
【初识ARM】ARM相关基础概念
学习·arm
GreenTea4 小时前
OpenAI Agents API 上手实测:一次调用把整个 agent loop 甩给 OpenAI
前端·后端·算法