这是悦乐书的第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+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

最新文章

  1. linux下libevent安装
  2. 【进展】LL谱面存储方式的改善
  3. 使用Spring AsyncRestTemplate对象进行异步请求调用
  4. NSComparisonResul、NSNotFound、NSEnumerationOptions......的用处
  5. Fingerprinting
  6. 2016年12月11日 星期日 --出埃及记 Exodus 21:6
  7. MYSQL 学习笔记1 -----mysqladmin -uroot -p status|extended-status
  8. Java基础学习第一天
  9. WCF学习心得
  10. 【G】开源的分布式部署解决方案文档 - 部署Console &amp; 控制负载均衡 &amp; 跳转持续集成控制台
  11. zabbix server总是stoped,找到此方法解决了问题
  12. Windows服务没有及时响应启动或控制请求1053
  13. 使用wireshark以及filddler配合抓去手机端的TCP以及HTTP请求
  14. python之with语句的原理
  15. 【转载】Ajax JS 跨域请求
  16. 【python】模块整理
  17. Stream中reduce()使用记录
  18. Google的创新九原则(转)
  19. 【转】TCP、UDP数据包大小的限制
  20. mac上调整phpstorm和webstorm的使用内存(默认是128m-750m) 避免卡顿

热门文章

  1. MySQL的binlog恢复(Windows下)
  2. Ansible基础认识及安装使用详解(week5_day1_part1)--技术流ken
  3. Centos 6.8 定时任务Crontab服务
  4. mongodb &quot;Element &#39;{0}&#39; does not match any field or property of class&quot; 异常的解决方法
  5. mysql中general_log查询日志
  6. js中字符串和数组的使用
  7. RPC调用与GC垃圾回收
  8. Aurelia 创建模板
  9. mysql date_format()函数
  10. 34.Odoo产品分析 (四) – 工具板块(5) – 设备及联系人目录(1)