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

news/2024/11/28 6:33:11/

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

文章目录

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

题目链接

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

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

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

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

三种解法

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

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); //将左右节点的路径加和}
}

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

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;}
}

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

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

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);}
}
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);}
}

前缀和解法

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(左节点,右节点),也就是返会当前节点获得的最大值

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.ppmy.cn/news/23950.html

相关文章

Android 逆向工具大整理,碉堡了

文章目录jadx打开 gui 界面把安装包打开双击变量名和方法名可以高亮所有出现的地方**强大的搜索功能****搜索资源****查看 APK 签名****查看 APK dex 数&#xff0c;方法数****查看资源&#xff0c;配置清单****展开包名**查找方式引用反混淆导出 Gradle 工程导出反编译资源cla…

云原生系列之使用 prometheus监控MySQL实战

文章目录前言一. 实验环境二. 安装MySQL5.72.1 配置yum源2.2 安装MySQL之前的环境检查2.3 开始使用yum安装2.4 启动MySQL并测试三. 安装MySQL_exporter3.1 MySQL_exporter的介绍3.2 mysql_exporter的安装3.3 设置MySQL账户&#xff0c;用于数据收集3.4 启动mysql_exporter3.5 配…

python selenium浏览器复用技术

使用selenium 做web自动化的时候&#xff0c;经常会遇到这样一种需求&#xff0c;是否可以在已经打开的浏览器基础上继续运行自动化脚本&#xff1f; 这样前面的验证码登录可以手工点过去&#xff0c;后面页面使用脚本继续执行&#xff0c;这样可以解决很大的一个痛点。 命令行…

学弟学妹少走弯路,超完整算法刷题路线出炉

大家好&#xff0c;我是帅地。 本篇文章主要讲解下面三个事&#xff1a; 1、自己学习算法的一些经历 2、大家学习算法存在的一些普遍问题 3、给大家规划的算法刷题路线 一、算法学习往事 记得当初学了 C 语言就开始刷题了&#xff0c;刷题倒不是面试&#xff0c;而是为了…

【Spark分布式内存计算框架——Spark Core】5. RDD 函数补充:关联函数与练习

关联函数 当两个RDD的数据类型为二元组Key/Value对时&#xff0c;可以依据Key进行关联Join。 首先回顾一下SQL JOIN&#xff0c;用Venn图表示如下&#xff1a; RDD中关联JOIN函数都在PairRDDFunctions中&#xff0c;具体截图如下&#xff1a; 具体看一下join&#xff08;等…

git、gitee、github关系梳理及ssh不对称加密大白话解释

温馨提示&#xff1a;本文不会讲解如何下载、安装git&#xff0c;也不会讲解如何注册、使用gitee或GitHub&#xff0c;这些内容网上一大把&#xff0c;B站上的入门课程也很多&#xff0c;自己看看就好了。 本文仅对 git、gitee、github的关系梳理及ssh公钥私钥授权原理用白话讲…

移除元素-力扣27-java

一、题目描述给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。不要使用额外的数组空间&#xff0c;你必须仅使用 O(1) 额外空间并 原地 修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新…

LSTM已死,Transformer当立(LSTM is dead. Long Live Transformers! ):上

回想一下在Seq2seq模型中,如何使用Attention。这里简要回顾一下【1】介绍的方法2(并以此为基础展开对Transformer的讨论)。 下图中包含一个encoder(左)和一个decoder(右)。对于decoder来说,给定一个输入,得到输出,如何进一步得到context vector 呢? 我们需要根据和…