leetcode刷题 | 关于二叉树的题型总结2

news/2024/7/20 21:29:32 标签: leetcode, 深度优先, 算法, java, 数据结构

leetcode__2_0">leetcode刷题 | 关于二叉树的题型总结2

文章目录

  • leetcode刷题 | 关于二叉树的题型总结2
    • 题目链接
    • 求根节点到叶节点数字之和
    • 路径总和 III
    • 二叉树中的最大路径和

题目链接

129. 求根节点到叶节点数字之和 - 力扣(LeetCode)

437. 路径总和 III - 力扣(LeetCode)

124. 二叉树中的最大路径和 - 力扣(LeetCode)

求根节点到叶节点数字之和

三种解法

第一种带有返回值的dfs,返回值为某一路径的值

java">class Solution {
    
    public int sumNumbers(TreeNode root) {
        return dfs(root,0);
    }
    public int dfs(TreeNode root,int sum){
        // sum存储的是每一条路径的和
        if(root == null) return 0;
        sum = sum *10 + root.val;
        if(root.left == null && root.right == null) return sum;//返会这条路径的值
        else return dfs(root.left,sum)+dfs(root.right,sum); //将左右节点的路径加和
    }
}

第二种不带返回值的递归+回溯

java">class Solution {
    int sum = 0,num = 0;
    public int sumNumbers(TreeNode root) {
        dfs(root);
        return sum;
    }
    public void dfs(TreeNode root){
        if(root == null) return;
        num = num*10+root.val;//一直没有到叶子路径
        if(root.left == null && root.right == null)
            sum += num; //叶子节点,将这一路径的值加和
        dfs(root.left);
        dfs(root.right);
        num = (num-root.val)/10;
        
    }
}

第三种广度优先搜索,定义两个栈,一个存储节点一个存储节点值

java">class Solution {
    public int sumNumbers(TreeNode root) {
        Deque<TreeNode> deq1 = new ArrayDeque();
        Deque<Integer> deq2 = new ArrayDeque();
        deq1.add(root);
        deq2.add(root.val);
        int sum = 0;
        while(!deq1.isEmpty()){
            TreeNode node = deq1.poll();
            int num = deq2.poll();
            if(node.left == null && node.right == null){
                sum += num;
            }
            if(node.left != null){
                deq1.add(node.left);
                deq2.add(num*10+node.left.val);
            }
            if(node.right != null){
                deq1.add(node.right);
                deq2.add(num*10+node.right.val);
            }
        }
        return sum;
    }
}

路径总和 III

java">class Solution {
    
    public int pathSum(TreeNode root, long targetSum) {
        if(root == null) return 0;
        return dfs(root,targetSum)+pathSum(root.left,targetSum)+pathSum(root.right,targetSum);
    }
    public int dfs(TreeNode root, long targetSum){
        if(root == null) return 0;
        int res = 0;
        if(root.val == targetSum)
            res ++;
        return res + dfs(root.left,targetSum-root.val)+dfs(root.right,targetSum-root.val);
    }
}
java">class Solution {
    private int res;
    public int pathSum(TreeNode root, int targetSum) {      
        if(root==null) return res;
        help(root,targetSum);
        pathSum(root.left,targetSum);
        pathSum(root.right,targetSum);
        return res;
    }
    public void help(TreeNode root,int target){
        if(root==null) return;
        if(root.val==target) res++;
        help(root.left,target-root.val);
        help(root.right,target-root.val);
    }
}

前缀和解法

java">class Solution {
    public int pathSum(TreeNode root, long targetSum) {
        Map<Long, Integer> prefix = new HashMap<Long, Integer>();
        prefix.put(0L, 1);
        return dfs(root, prefix, 0, targetSum);
    }
    public int dfs(TreeNode root,Map<Long,Integer> prefix,long cur,long target){
        if (root == null) return 0;
        int res = 0;
        cur += root.val; //当前节点的前缀和
        res = prefix.getOrDefault(cur-target,0);
        prefix.put(cur,prefix.getOrDefault(cur,0)+1);
        res += dfs(root.left,prefix,cur,target);
        res += dfs(root.right,prefix,cur,target);
        //回溯
        prefix.put(cur,prefix.getOrDefault(cur,0)-1);
        return res;

    }
}

二叉树中的最大路径和

遍历顺序为后序遍历,左右中,先把左右节点的最大值获取到,将当前节点作为拐点,连接左右两个节点,更新路径最大值后,返会当前节点+Math.max(左节点,右节点),也就是返会当前节点获得的最大值

java">class Solution {
    int max = Integer.MIN_VALUE;
    public int maxPathSum(TreeNode root) {
        dfs(root);
        return max;
    }
    public int dfs(TreeNode root){
        if (root == null) return 0;
        int LeftMax = Math.max(dfs(root.left),0);//返会当前节点右节点的最大值
        int RightMax = Math.max(dfs(root.right),0);//返回当前节点左节点的最大值
        max = Math.max(max,root.val+LeftMax+RightMax);//更新路径的最大值
        return root.val + Math.max(LeftMax,RightMax);//返回当前节点的最大值  
    }
}

http://www.niftyadmin.cn/n/55519.html

相关文章

笔试题-2023-荣耀-芯片设计【纯净题目版】

回到首页:2023 数字IC设计秋招复盘——数十家公司笔试题、面试实录 推荐内容:数字IC设计学习比较实用的资料推荐 题目背景 笔试时间:2022.09.24应聘岗位:荣耀校园招聘-芯片与器件设计工程师-芯片开发笔试时长:60min笔试平台:nowcoder牛客网题目类型:单选题(40道)、不…

10.数据库恢复技术

其他章节here 梳理 名词解释 事务&#xff1a;事务是用户定义的 一个数据操作序列&#xff0c;这些操作要么全做&#xff0c;要么全不做&#xff0c;是一个不可分割的工作单位 事务≠程序 事务是恢复和并发控制的基本单位 &#xff08;事务时数据库应用程序的基本逻辑单元&am…

半人半妖时代来啦

未来是半人半妖时代&#xff01;&#xff01;&#xff01; 碳基生命与硅基生命结合 趣讲大白话&#xff1a;人和机器结合是大趋势 *********** 人工智能就是宗&#xff5e;教 科技宗&#xff5e;教的一支最强势的教派 日常使用智能机器的人就是信众 维护机器的人就是牧师 创造这…

python基于django的 大学生健康管理系统

随着时代的发展,大学生的数量与日预增但是相对的也出现了很多心理问题,大学生因为各类心理引发的社会问题已经受到了很多人的关注,所以如何更好的培养大学生正确的心理健康问题是现在很多大学多面临的一个重要的问题。 系统设置了三种身份的登录,包括管理员,医生和学生。其中管…

spark数据清洗练习

文章目录准备工作删除缺失值 > 3 的数据删除星级、评论数、评分中任意字段为空的数据删除非法数据hotel_data.csv通过编写Spark程序清洗酒店数据里的缺失数据、非法数据、重复数据准备工作 搭建 hadoop 伪分布或 hadoop 完全分布上传 hotal_data.csv 文件到 hadoopidea 配置…

湖南中创教育PMP项目管理——团队管理

一、团队管理常见误区 1、团队是项目经理自己的事 →团队管理不是项目经理自己的事情&#xff0c;团队中的每一位成员都要参与进来 2、没钱、没时间就难以开展团队建设 →只要提升工作效率&#xff0c;加强团队凝聚力都是团队建设活动 3、团队建设和项目工作冲突 →诸如项目…

4.5 集合

文章目录1.概述2.集合概念3.集合的继承结构4.Collection方法速查表5.迭代6.练习:Collection接口测试1.概述 集合是JAVA中比较重要的一个概念。 前边我们学习了数组&#xff0c;数组的必须在编译时就确定其具体的大小&#xff0c;这导致在实际开发中&#xff0c;无法很好的去使…

gcc编译相关教程

二、gcc编译选项 Warning Options (Using the GNU Compiler Collection (GCC)) gcc编译选项_挽风~的博客-CSDN博客 严格的编译参数有利于在编译时发现问题&#xff0c;提高代码质量。 1. 重要说明 通过 -W 开头&#xff0c;能指定开启许多警告&#xff0c;与之对应通过 -W…