代码随想录算法训练营第十七天|110.平衡二叉树 ,257. 二叉树的所有路径 ,404.左叶子之和

news/2024/11/17 7:30:30/

110.平衡二叉树 

110. 平衡二叉树

思路:

分别求出每个节点其左右子树的高度,然后如果差值小于等于1,则返回当前二叉树的高度,否则返回-1,表示已经不是二叉平衡树了。

代码实现:

 一棵高度平衡二叉树定义为:
一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。*/class Solution {public boolean isBalanced(TreeNode root) {//后序遍历+剪枝(从底至顶)return recur(root)!=-1;}public int recur(TreeNode root){if(root==null){return 0;}//注意这里是return 0int leftDepth=recur(root.left);if(leftDepth==-1){return -1;}int rightDepth=recur(root.right);if(rightDepth==-1){return -1;}return Math.abs(leftDepth-rightDepth)<2?Math.max(leftDepth,rightDepth)+1:-1;//如果当前节点的左右子树的深度差小于2则返回左右深度的较大者加1,否则返回-1}
}

257.二叉树的所有路径

1.递归+回溯  这个解法不太理解

2.DFS递归 :每个节点访问的时候不是把他打印出来,而是先把他存储起来,到叶子结点的时候再添加到集合中,最后返回集合的值;

如果是叶子节点,说明找到一条路径,把它加入到res中,如果不是叶子节点则继续dfs遍历左右子节点;如果是非叶子节点,

257. 二叉树的所有路径

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {//递归+回溯法public List<String> binaryTreePaths(TreeNode root) {List<String> res = new ArrayList<>();// 存最终的结果if (root == null) {return res;}List<Integer> paths=new ArrayList<>();traversal(root,paths,res);return res;}public void traversal(TreeNode root,List<Integer>paths,List<String> res){paths.add(root.val);//前序遍历,中//遇到叶子节点if(root.left==null&&root.right==null){//输出StringBuilder sb=new StringBuilder();//for(int i=0;i<paths.size()-1;i++){sb.append(paths.get(i)).append("->");}sb.append(paths.get(paths.size()-1));//记录最后一个节点res.add(sb.toString());}//递归和回溯同时进行,放在同一个括号中if(root.left!=null){traversal(root.left,paths,res);paths.remove(paths.size()-1);//回溯}if(root.right!=null){traversal(root.right,paths,res);paths.remove(paths.size()-1);//回溯}}
}
//1,深度优先搜索(递归写法),每个节点访问的时候不是把他打印出来,而是先把他存储起来,到叶子结点的时候再添加到集合中,最后返回集合的值class Solution {public List<String> binaryTreePaths(TreeNode root) {List<String> res = new ArrayList<>();dfs(root, "", res);return res;}private void dfs(TreeNode root, String path, List<String> res) {//如果为空,直接返回if (root == null)return;//如果是叶子节点,说明找到了一条路径,把它加入到res中if (root.left == null && root.right == null) {res.add(path + root.val);return;}//如果不是叶子节点,在分别遍历他的左右子节点dfs(root.left, path + root.val + "->", res);dfs(root.right, path + root.val + "->", res);}}

404.左叶子之和

思路,这道题AC出乎意料,分别求出root的左右子树的左叶子节点之和,然后二者相加就是答案。

关于左叶子节点的判断要通过其父节点来判断,如果父节点root的左孩子不为空,左孩子的左右孩子为空,说明root的左孩子是叶子节点

404. 左叶子之和

代码实现: 

class Solution {public int sumOfLeftLeaves(TreeNode root) {//节点A的左孩子为空,且左孩子的左右孩子都为空,说明这个左孩子是左叶子//求root节点的  左子树的所有左叶子节点之和+右子树的所有左叶子节点之和if(root==null){return 0;}int leftSum=sumOfLeftLeaves(root.left);int rightSum=sumOfLeftLeaves(root.right);if(root.left!=null&&root.left.left==null&&root.left.right==null){//说明root的左孩子是叶子节点,即左叶子leftSum+=root.left.val;}return leftSum+rightSum;}
}


http://www.ppmy.cn/news/1027986.html

相关文章

Python语言基础---选择判断循环结构详解

文章目录 &#x1f340;引言&#x1f340;if语句&#x1f340;if-else语句&#x1f340;if-elif-else语句&#x1f340;for循环&#x1f340;while循环 &#x1f340;引言 在Python编程语言中&#xff0c;选择判断和循环是两个非常重要的概念。它们可以让我们根据条件执行不同的…

大语言模型:LLM的概念是个啥?

一、说明 大语言模型&#xff08;维基&#xff1a;LLM- large language model&#xff09;是以大尺寸为特征的语言模型。它们的规模是由人工智能加速器实现的&#xff0c;人工智能加速器能够处理大量文本数据&#xff0c;这些数据大部分是从互联网上抓取的。 [1]所构建的人工神…

C# 随机法求解线性规划问题 蒙特卡洛

线性规划问题: max3x12x2 x12x2<5 2x1x2<4 4x13x2<9 x1>0 x2>0 正确的结果:x11.5; x21, max z6.5 Random random1 new Random(DateTime.Now.Millisecond);Random random2 new Random(DateTime.Now.Millisecond*DateTime.Now.Millisecond);double max-9999,x1…

4945: 二进制转十进制

4945: 二进制转十进制 时间限制: 1.000 Sec 内存限制: 128 MB 提交: 520 解决: 335 [命题人:][下载数据: 30] 提交状态报告 题目描述 将二进制数转成十进制输出 输入 一行&#xff0c;一个二进制数&#xff0c;二进制数的位数小于32位。 输出 一个十进制的整数。…

信创麒麟操作系统卸载docker,并分别用在线、yum、rpm三种方式安装信创的docker

备注&#xff1a;操作前建议对机器打快照备份&#xff0c;或者备份好数据&#xff0c;如未使用&#xff0c;第一次部署的情况可直接操作 一、卸载DataEase自带的docker # 停止服务 service dataease stop# 删除 docker 可执行文件 rm -f /usr/bin/containerd-shim-runc-v2 r…

第3章:线性模型

线性回归 优点&#xff1a;简单、基本、可理解性好。 适用于处理数值型数据。编码&#xff1a;序关系&#xff08;衣服号码s、m、l等等&#xff09;独热编码&#xff08;00010&#xff09; 求解 求偏导让导数为0&#xff1f;为什么&#xff1f; 希望找到极值点&#xff0c;即…

微服务02-docker

1、Docker架构 1.1 镜像和容器 Docker中有几个重要的概念: 镜像(Image):Docker将应用程序及其所需的依赖、函数库、环境、配置等文件打包在一起,称为镜像。Docker镜像是用于创建 Docker 容器的模板 。就像面向对象编程中的类。 容器(Container):镜像中的应用程序运…

JlinkV8 - 8步修复Jlink固件

现象 用着用着Jlink设备可以检测到&#xff0c;但是MDK检测不到设备序列号&#xff0c;换一个Jlink即可正常识别与烧录&#xff0c;很大概率是Jlink固件丢了&#xff0c;我用的山寨版本&#xff0c;市面基本是山寨版本 解决办法 1、查看Jlink的芯片型号&#xff0c;比如我打开…