代码随想录训练营day17|110.平衡二叉树 257. 二叉树的所有路径 404.左叶子之和 v...

简介: 代码随想录训练营day17|110.平衡二叉树 257. 二叉树的所有路径 404.左叶子之和 v...

前言

代码随想录算法训练营day17


一、Leetcode 110.平衡二叉树

1.题目

给定一个二叉树,判断它是否是高度平衡的二叉树。

本题中,一棵高度平衡二叉树定义为:

一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。

示例 1:

输入:root = [3,9,20,null,null,15,7] 输出:true

示例 2:

输入:root = [1,2,2,3,3,null,null,4,4] 输出:false

示例 3:

输入:root = [] 输出:true

提示:

1. 树中的节点数在范围 [0, 5000] 内
2. -104 <= Node.val <= 104

来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/balanced-binary-tree

2.解题思路

解题思路

方法一:自顶向下的递归

定义函数 heightheight,用于计算二叉树中的任意一个节点 pp 的高度:

height(p)={0p 是空节点max⁡(height(p.left),height(p.right))+1p 是非空节点height(p)={0max(height(p.left),height(p.right))+1p 是空节点p 是非空节点

有了计算节点高度的函数,即可判断二叉树是否平衡。具体做法类似于二叉树的前序遍历,即对于当前遍历到的节点,首先计算左右子树的高度,如果左右子树的高度差是否不超过 11,再分别递归地遍历左右子节点,并判断左子树和右子树是否平衡。这是一个自顶向下的递归的过程。

3.代码实现

```java class Solution { public boolean isBalanced(TreeNode root) { if (root == null) { return true; } else { return Math.abs(height(root.left) - height(root.right)) <= 1 && isBalanced(root.left) && isBalanced(root.right); } }

1. public int height(TreeNode root) {
2. if (root == null) {
3. return 0;
4.     } else {
5. return Math.max(height(root.left), height(root.right)) + 1;
6.     }
7. }

}

```

二、Leetcode 257. 二叉树的所有路径

1.题目

给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。

叶子节点 是指没有子节点的节点。

示例 1:

输入:root = [1,2,3,null,5] 输出:["1->2->5","1->3"]

示例 2:

输入:root = [1] 输出:["1"]

提示:

1. 树中节点的数目在范围 [1, 100] 内
2. -100 <= Node.val <= 100

来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/binary-tree-paths

2.解题思路

方法一:深度优先搜索

思路与算法

最直观的方法是使用深度优先搜索。在深度优先搜索遍历二叉树时,我们需要考虑当前的节点以及它的孩子节点。

1. 如果当前节点不是叶子节点,则在当前的路径末尾添加该节点,并继续递归遍历该节点的每一个孩子节点。
2. 如果当前节点是叶子节点,则在当前路径末尾添加该节点后我们就得到了一条从根节点到叶子节点的路径,将该路径加入到答案即可。

如此,当遍历完整棵二叉树以后我们就得到了所有从根节点到叶子节点的路径。当然,深度优先搜索也可以使用非递归的方式实现,这里不再赘述。

3.代码实现

```java class Solution { public List binaryTreePaths(TreeNode root) { List paths = new ArrayList (); constructPaths(root, "", paths); return paths; }

1. public void constructPaths(TreeNode root, String path, List<String> paths) {
2. if (root != null) {
3.         StringBuffer pathSB = new StringBuffer(path);
4.         pathSB.append(Integer.toString(root.val));
5. if (root.left == null && root.right == null) {  // 当前节点是叶子节点
6.             paths.add(pathSB.toString());  // 把路径加入到答案中
7.         } else {
8.             pathSB.append("->");  // 当前节点不是叶子节点,继续递归遍历
9.             constructPaths(root.left, pathSB.toString(), paths);
10.             constructPaths(root.right, pathSB.toString(), paths);
11.         }
12.     }
13. }

}

```

三、Leetcode 404.左叶子之和 v

1.题目

给定二叉树的根节点 root ,返回所有左叶子之和。

示例 1:

输入: root = [3,9,20,null,null,15,7] 输出: 24 解释: 在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24

示例 2:

输入: root = [1] 输出: 0

提示:

1. 节点数在 [1, 1000] 范围内
2. -1000 <= Node.val <= 1000

来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/sum-of-left-leaves

2.解题思路

方法一:深度优先搜索

3.代码实现

```java class Solution { public int sumOfLeftLeaves(TreeNode root) { return root != null ? dfs(root) : 0; }

1. public int dfs(TreeNode node) {
2.     int ans = 0;
3. if (node.left != null) {
4.         ans += isLeafNode(node.left) ? node.left.val : dfs(node.left);
5.     }
6. if (node.right != null && !isLeafNode(node.right)) {
7.         ans += dfs(node.right);
8.     }
9. return ans;
10. }
11. 
12. public boolean isLeafNode(TreeNode node) {
13. return node.left == null && node.right == null;
14. }

}

```


相关文章
|
JSON 运维 监控
Spring Boot中的健康检查端点配置
Spring Boot中的健康检查端点配置
|
网络协议 网络虚拟化
刚入行,IPv6地址确实还有一些常识不懂!
刚入行,IPv6地址确实还有一些常识不懂!
467 0
|
消息中间件 存储 druid
大数据-156 Apache Druid 案例实战 Scala Kafka 订单统计
大数据-156 Apache Druid 案例实战 Scala Kafka 订单统计
219 3
|
关系型数据库 MySQL 网络安全
有关使用Navicat 无法成功连接腾讯云服务器上Mysql的问题解决
这篇文章提供了解决Navicat无法连接腾讯云服务器上MySQL问题的步骤,包括调整防火墙设置、更新MySQL权限和检查远程连接配置。
有关使用Navicat 无法成功连接腾讯云服务器上Mysql的问题解决
|
存储 网络协议 安全
获取真实 IP 地址(二):绕过 CDN(附链接)
获取真实 IP 地址(二):绕过 CDN(附链接)
|
机器学习/深度学习 存储 算法
Python 元学习实用指南:6~10
Python 元学习实用指南:6~10
302 1
|
JavaScript 前端开发 Java
【面试题】Vue2的$nextTick原理解析
【面试题】Vue2的$nextTick原理解析
206 1
|
Linux 程序员
01 官网下载各种CentOS教程(超详细版)
01 官网下载各种CentOS教程(超详细版)
1048 0
|
存储 分布式计算 负载均衡
考研408系列--计算机网络(计算机网络概述)
考研408系列--计算机网络(计算机网络概述)
258 0
|
存储 算法 Java
java集合框架Map之HashMap底层原理解析
阈值(threshold) = 负载因子(loadFactor) x 容量(capacity) , 当HashMap中的table数组(桶)的长度 >= 阈值的时候就会自动触发扩容机制
224 0