LeetCode算法题-Sum of Left Leaves(Java实现)
2024-08-31 21:50:23
这是悦乐书的第217次更新,第230篇原创
01 看题和准备
今天介绍的是LeetCode算法题中Easy级别的第85题(顺位题号是404)。找到给定二叉树中所有左叶的总和。例如:
二叉树中有两个左叶,分别为9和15。 返回24。
3
/ \
9 20
/ \
15 7
本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。
02 第一种解法
使用递归。
特殊情况:当root为null时,直接返回0。
正常情况:定义一个变量sum来存每一次遇到左节点的累加和。如果当前节点的左节点不为空,则需要进一步判断该左节点自身有没有子节点,有子节点就继续调用方法本身,既没有左节点又没有右节点的时候,则将该节点值累加到sum上,接着使用当前节点的右节点继续调用自身,其返回的结果还是需要和sum累加,最后返回sum。
public int sumOfLeftLeaves(TreeNode root) {
if (root == null) {
return 0;
}
int sum = 0;
if (root.left != null) {
if (root.left.left == null && root.left.right == null) {
sum += root.left.val;
} else {
sum += sumOfLeftLeaves(root.left);
}
}
sum += sumOfLeftLeaves(root.right);
return sum;
}
03 第二种解法
使用迭代的方法。
特殊情况:当root为null或者root没有子节点的时候,直接返回0。
正常情况:使用队列,先将root放入队列,然后开始循环,取出的当前节点的左节点不为空,就继续判断该左节点的左节点、右节点是不是都为空,如果都为空,就将该左节点的节点值累加进sum,如果不满足,则将其放入队列。如果当前节点的右节点不为空,则将其放入队列。这里的判断逻辑和上面递归方法是一致的。最后返回sum。
public int sumOfLeftLeaves2(TreeNode root) {
int sum = 0;
if (root == null) {
return sum;
}
if (root.left == null && root.right == null) {
return sum;
}
Queue<TreeNode> queue = new LinkedList<TreeNode>();
queue.offer(root);
while (!queue.isEmpty()) {
TreeNode node = queue.poll();
if (node.left != null) {
if (node.left.left == null && node.left.right == null) {
sum += node.left.val;
} else {
queue.offer(node.left);
}
}
if (node.right != null) {
queue.offer(node.right);
}
}
return sum;
}
04 第三种解法
使用栈,思路和第二种解法一样。
public int sumOfLeftLeaves3(TreeNode root) {
int sum = 0;
if (root == null) {
return sum;
}
if (root.left == null && root.right == null) {
return sum;
}
Stack<TreeNode> stack = new Stack<TreeNode>();
stack.push(root);
while (!stack.isEmpty()) {
TreeNode node = stack.pop();
if (node.left != null) {
if (node.left.left == null && node.left.right == null) {
sum += node.left.val;
} else {
stack.push(node.left);
}
}
if (node.right != null) {
stack.push(node.right);
}
}
return sum;
}
05 小结
算法专题目前已连续日更超过两个月,算法题文章85+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。
以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!
最新文章
- linux下libevent安装
- 【进展】LL谱面存储方式的改善
- 使用Spring AsyncRestTemplate对象进行异步请求调用
- NSComparisonResul、NSNotFound、NSEnumerationOptions......的用处
- Fingerprinting
- 2016年12月11日 星期日 --出埃及记 Exodus 21:6
- MYSQL 学习笔记1 -----mysqladmin -uroot -p status|extended-status
- Java基础学习第一天
- WCF学习心得
- 【G】开源的分布式部署解决方案文档 - 部署Console &; 控制负载均衡 &; 跳转持续集成控制台
- zabbix server总是stoped,找到此方法解决了问题
- Windows服务没有及时响应启动或控制请求1053
- 使用wireshark以及filddler配合抓去手机端的TCP以及HTTP请求
- python之with语句的原理
- 【转载】Ajax JS 跨域请求
- 【python】模块整理
- Stream中reduce()使用记录
- Google的创新九原则(转)
- 【转】TCP、UDP数据包大小的限制
- mac上调整phpstorm和webstorm的使用内存(默认是128m-750m) 避免卡顿
热门文章
- MySQL的binlog恢复(Windows下)
- Ansible基础认识及安装使用详解(week5_day1_part1)--技术流ken
- Centos 6.8 定时任务Crontab服务
- mongodb ";Element &#39;{0}&#39; does not match any field or property of class"; 异常的解决方法
- mysql中general_log查询日志
- js中字符串和数组的使用
- RPC调用与GC垃圾回收
- Aurelia 创建模板
- mysql date_format()函数
- 34.Odoo产品分析 (四) – 工具板块(5) – 设备及联系人目录(1)