二叉树习题其二Java【力扣】【算法学习day.9】

news/2024/10/21 21:03:15/

前言

前言
书接上篇文章二叉树习题其一,这篇文章我们将基础拓展

###我做这类文档一个重要的目的还是给正在学习的大家提供方向(例如想要掌握基础用法,该刷哪些题?)我的解析也不会做的非常详细,只会提供思路和一些关键点,力扣上的大佬们的题解质量是非常非常高滴!!!


习题

1.完全二叉树的节点个数

题目链接:222. 完全二叉树的节点个数 - 力扣(LeetCode)

题面:

 基本分析:遍历二叉树,遍历的过程中维护一个变量用于统计节点个数

代码:

java">/*** 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 {int count = 0;public int countNodes(TreeNode root) {if(root==null)return 0;recursion(root);return count;}public void recursion(TreeNode node){if(node==null)return;if(node!=null)count++;recursion(node.left);recursion(node.right);}
}

2.平衡二叉树

题目链接:110. 平衡二叉树 - 力扣(LeetCode)

基本分析:判断是否是平衡二叉树就是判断每个‘根节点’的左右子树的高度差是否小于等于1,以此递归下去

代码:

java">/*** 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 boolean isBalanced(TreeNode root) {return recursion(root)!=-1;}public int recursion(TreeNode node){if(node==null){return 0;}int left = recursion(node.left);if(left==-1){return -1;}int right = recursion(node.right);if(right==-1){return -1;}return Math.abs(left-right)>=2?-1:Math.max(left,right)+1;}}

3.二叉树的所有路径

题目链接:257. 二叉树的所有路径 - 力扣(LeetCode)

基本分析:同样是遍历二叉树,值得注意的是,拼接箭头最好在递归函数调用的时候,这样可以省去很多麻烦 

代码:

java">/*** 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 {List<String> list = new ArrayList<>();public List<String> binaryTreePaths(TreeNode root) {recursion(root,"");return list;}public void recursion(TreeNode node,String pre){pre+=node.val;if(node.left!=null) recursion(node.left,pre+"->");if(node.right!=null) recursion(node.right,pre+"->");if(node.left==null&&node.right==null){list.add(pre);return;}}
}

4.左叶子之和

题目链接:404. 左叶子之和 - 力扣(LeetCode)

基本分析:递归函数多维护一个字符串,用于标记该节点是否为左节点,然后就是遍历到最后一个节点进行相加操作

代码:

java">/*** 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 {int sum = 0;public int sumOfLeftLeaves(TreeNode root) {if(root==null||(root.left==null&&root.right==null))return 0;recursion(root.left,"left");recursion(root.right,"right");return sum;}public void recursion(TreeNode node,String flag){if(node==null){return;}if(node.left==null&&node.right==null&&flag.equals("left")){sum+=node.val;}if(node.left!=null){recursion(node.left,"left"); }if(node.right!=null){recursion(node.right,"right"); }}
}

5.找树左下角的值

题目链接:513. 找树左下角的值 - 力扣(LeetCode)

题面:

基本分析: 这道题要求是找最底层最左边的元素,如果我们调用递归函数是先遍历左节点再遍历右节点,那么一定是先遍历到最底层的左节点,所以只需要判断是不是更低一层即可,然后更改值

代码:

java">/*** 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 {int ans = 0;int count = Integer.MIN_VALUE;public int findBottomLeftValue(TreeNode root) {ans = root.val;recursion(root.left,2);recursion(root.right,2);return ans;}public void recursion(TreeNode node,int u){if(node==null)return;if(node.left==null&&node.right==null){if(u>count){System.out.println(1);count = u;ans = node.val;}}recursion(node.left,u+1);recursion(node.right,u+1);     }
}

6.路径总和

题目链接:112. 路径总和 - 力扣(LeetCode)

题面:

基本分析: 遍历,并维护一个值,用来记录到达底部时是否和目标值相同

代码:

java">/*** 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 {int target =0;public boolean hasPathSum(TreeNode root, int targetSum) {if(root==null)return false;target = targetSum;return recursion(root,0);}public boolean recursion(TreeNode node,int sum){if(node==null)return false;sum+=node.val;if(node.left==null&&node.right==null){return sum==target;}boolean bool1 =  recursion(node.left,sum);boolean bool2 =  recursion(node.right,sum);return bool1||bool2;}
}

后言

上面是二叉树的部分习题,下一篇会讲解二叉树的其他相关力扣习题,希望有所帮助,一同进步,共勉! 


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

相关文章

03 设计模式-创造型模式-单例模式

单例模式&#xff08;Singleton Pattern&#xff09;是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式&#xff0c;它提供了一种创建对象的最佳方式。 这种模式涉及到一个单一的类&#xff0c;该类负责创建自己的对象&#xff0c;同时确保只有单个对象被创建…

「漏洞复现」英飞达医学影像存档与通信系统 WebUserLogin.asmx 信息泄露漏洞

0x01 免责声明 请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;作者不为此承担任何责任。工具来自网络&#xff0c;安全性自测&#xff0c;如有侵权请联系删…

Linux下压缩与解压缩命令大全【详解】

&#x1f468;‍&#x1f393;博主简介 &#x1f3c5;CSDN博客专家   &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01…

二叉树算法之二叉树遍历(前序、中序、后序、层次遍历)

二叉树遍历是指按照某种顺序访问二叉树的所有节点。常见的二叉树遍历方式包括前序遍历&#xff08;Preorder Traversal&#xff09;、中序遍历&#xff08;Inorder Traversal&#xff09;、后序遍历&#xff08;Postorder Traversal&#xff09;和层次遍历&#xff08;Level-or…

Vue前端预览docx文档

Vue前端预览docx文档 实现效果 vue代码 <el-dialog title"预览" :visible.sync"filePreview"><div ref"file"></div></el-dialog>引入依赖文件 官方文档地址 https://www.npmjs.com/package/docx-preview?activeTabre…

SpringCloud Gateway保姆级入门教程

什么是微服务网关 SpringCloud Gateway是Spring全家桶中一个比较新的项目&#xff0c;Spring社区是这么介绍它的&#xff1a; 该项目借助Spring WebFlux的能力&#xff0c;打造了一个API网关。旨在提供一种简单而有效的方法来作为API服务的路由&#xff0c;并为它们提供各种增强…

uniapp配置微信小程序分包(分包优化)

1.manifest.json中 源码视图中找到mp-weixin&#xff0c;新增代码"optimization":{"subPackages":true}&#xff0c;如下图所示 "optimization" : {"subPackages" : true } 2.pages.json中 分包内静态文件示例 "subPackages&…

利用mydumper从MySQL迁移数据到OceanBase数据库命令记录

一&#xff1a;中转服务器环境准备 1、下载安装包。 请根据需要在 下载安装包 中&#xff0c;下载对应的安装包并安装。 2、在数据库主机上解压缩安装包。 以 mydumper-0.12.7-2-zstd.el7.x86_64.rpm 为示例。 rpm2cpio mydumper-0.12.7-2-zstd.el7.x86_64.rpm | cpio -di…