力扣-数据结构-8【算法学习day.79】

前言

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

今天开始复习树,简单的题目不会具体分析


习题

1.二叉树的前序遍历

题目链接:144. 二叉树的前序遍历 - 力扣(LeetCode)

题面:

代码: 

/*** 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<Integer> ans = new ArrayList<>();public List<Integer> preorderTraversal(TreeNode root) {recursion(root);return ans;}public void recursion(TreeNode node){if(node==null)return;ans.add(node.val);recursion(node.left);recursion(node.right);}
}

2. 叶子相似的树

题目链接:872. 叶子相似的树 - 力扣(LeetCode)

题面:

代码:

/*** 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<Integer> list1 = new ArrayList<>();List<Integer> list2 = new ArrayList<>();public boolean leafSimilar(TreeNode root1, TreeNode root2) {recursion(root1,1);recursion(root2,2);if(list1.size()!=list2.size())return false;for(int i = 0;i<list1.size();i++){if(!list1.get(i).equals(list2.get(i)))return false;}return true;}public void recursion(TreeNode node,int flag){if(node==null)return;if(node.left==null&&node.right==null){if(flag==1){list1.add(node.val);}else{list2.add(node.val);}return;}recursion(node.left,flag);recursion(node.right,flag);}
}

3.开幕式焰火

题目链接: LCP 44. 开幕式焰火 - 力扣(LeetCode)

题面:

代码:

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode(int x) { val = x; }* }*/
class Solution {Map<Integer,Integer> map = new HashMap<>();int ans = 0;public int numColor(TreeNode root) {recursion(root);return ans;}public void recursion(TreeNode node){if(node==null)return;recursion(node.left);recursion(node.right);if(map.getOrDefault(node.val,-1)==-1){ans++;map.merge(node.val,1,Integer::sum);}}
}

4.二叉树中第二小的节点

题目链接: 671. 二叉树中第二小的节点 - 力扣(LeetCode)

题面:

代码:

/*** 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[] arr= new int[30];int count = 0;public int findSecondMinimumValue(TreeNode root) {recursion(root);Arrays.sort(arr);int index = 0;while(arr[index]==0)index++;int first = arr[index];//    System.out.println(first);while(index<=29&&arr[index]==first)index++;return index==30?-1:arr[index];}public void recursion(TreeNode node){if(node==null)return;arr[count++] = node.val;recursion(node.left);recursion(node.right);}
}

5.求根节点到叶子节点数字之和

题目链接: 129. 求根节点到叶节点数字之和 - 力扣(LeetCode)

题面:

代码:

/*** 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;public int sumNumbers(TreeNode root) {recursion(root,0);return ans;}public void recursion(TreeNode node,int val){if(node==null)return;val=val*10+node.val;if(node.left==null&&node.right==null){ans+=val;return;}recursion(node.left,val);recursion(node.right,val);}
}

6.统计二叉树中好节点的数目

题目链接: 1448. 统计二叉树中好节点的数目 - 力扣(LeetCode)

题面:

代码:

/*** 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;public int goodNodes(TreeNode root) {recursion(root,Integer.MIN_VALUE);return ans;}public void recursion(TreeNode node,int max){if(node==null)return;if(node.val>=max){// System.out.println(node.val);ans++;max = node.val;}recursion(node.left,max);recursion(node.right,max);}
}

7.二叉树中的伪回文路径

题目链接:1457. 二叉树中的伪回文路径 - 力扣(LeetCode) 

题面:

 

分析:由于节点的值从1到9,所以可以用一个数组存遍历到的数的个数,遍历到尾节点的时候遍历数组,如果数组中奇数次数的个数超过1个,就无法构成回文 

代码:

/*** 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;public int pseudoPalindromicPaths (TreeNode root) {int[] arr = new int[10];recursion(root,arr);return ans;}public void recursion(TreeNode node, int[] arr){if(node==null)return;arr[node.val]++;if(node.left==null&&node.right==null){int count = 0;for(int a:arr){if(a%2==1)count++;}if(count<=1)ans++;arr[node.val]--;return;}recursion(node.left,arr);recursion(node.right,arr);arr[node.val]--;}
}

8.祖父节点值为偶数的节点和

题目链接: 1315. 祖父节点值为偶数的节点和 - 力扣(LeetCode)

题面:

代码:

/*** 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;public int sumEvenGrandparent(TreeNode root) {recursion(root,-1,-1);return ans;}public void recursion(TreeNode node,int par,int gpar){if(node==null)return;if(gpar!=-1&&gpar%2==0){ans+=node.val;}recursion(node.left,node.val,par);recursion(node.right,node.val,par);}
}

9.从叶节点开始的最小字符串

题目链接: 988. 从叶结点开始的最小字符串 - 力扣(LeetCode)

题面:

代码:

/*** 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 {String ans = "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz";public String smallestFromLeaf(TreeNode root) {recursion(root,"");return new StringBuilder().append(ans).reverse().toString();}public void recursion(TreeNode node,String str){if(node==null)return;int flag = 'a'+node.val;str+=(char)flag;if(node.left==null&&node.right==null){ans = compareToString(str,ans)?ans:str;return;}recursion(node.left,str);recursion(node.right,str);}public Boolean compareToString(String str1,String str2){char[] arr1 = str1.toCharArray();char[] arr2 = str2.toCharArray();int l1 = arr1.length-1;int l2 = arr2.length-1;while(l1>=0&&l2>=0){if(arr1[l1]>arr2[l2]){return true;}else if(arr1[l1]<arr2[l2]){return false;}l1--;l2--;}return l1==-1?false:true;}
}

10.节点与其祖先之间的最大差值

题目链接: 1026. 节点与其祖先之间的最大差值 - 力扣(LeetCode)

题面:

代码:

/*** 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;public int maxAncestorDiff(TreeNode root) {recursion(root,Integer.MAX_VALUE,Integer.MIN_VALUE);return ans;}public void recursion(TreeNode node,int min,int max){if(node==null)return;if(min!=Integer.MAX_VALUE){ans = Math.max(ans,Math.abs(min-node.val));}if(max!=Integer.MIN_VALUE){ans = Math.max(ans,Math.abs(max-node.val));}recursion(node.left,Math.min(min,node.val),Math.max(max,node.val));recursion(node.right,Math.min(min,node.val),Math.max(max,node.val));}
}

11.从根到叶的二进制数之和

题目链接: 1022. 从根到叶的二进制数之和 - 力扣(LeetCode)

题面:

代码:

/*** 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;public int sumRootToLeaf(TreeNode root) {recursion(root,0);return ans;}public void recursion(TreeNode node,int sum){if(node==null)return;sum = (sum<<1)+node.val;// System.out.println(sum);if(node.left==null&&node.right==null){ans+=sum;return;}recursion(node.left,sum);recursion(node.right,sum);}
}

12.在二叉树中增加一行

题目链接: 623. 在二叉树中增加一行 - 力扣(LeetCode)

题面:

代码:

/*** 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 TreeNode addOneRow(TreeNode root, int val, int depth) {if(depth==1){TreeNode node = new TreeNode(val);node.left  = root;return node;}Queue<TreeNode> queue = new LinkedList<>();int indexdepth = 2;queue.offer(root);Queue<TreeNode> queue2 = new LinkedList<>();while(indexdepth<depth){while(!queue.isEmpty()){TreeNode node = queue.poll();if(node.left!=null){queue2.offer(node.left);}if(node.right!=null){queue2.offer(node.right);}}queue = queue2;queue2 = new LinkedList<>();indexdepth++;}while(!queue.isEmpty()){TreeNode node = queue.poll();TreeNode left = node.left;TreeNode right = node.right;node.left = new TreeNode(val);node.right = new TreeNode(val);node.left.left = left;node.right.right = right;}return root;}
}

后言

上面是数据结构相关的习题,下一篇文章会将其他相关的习题。 

 

 

 

 

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/498585.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

FreeRTOS的内存管理(选择heap4.c文件的理由)

目录 1. 了解FreeRTOS内存管理 2. 了解内存碎片 3.了解各个heap.c的内存分配方法 1.heap1.c 2.heap2.c 3.heap3.c 4.heap4.c 5.heap5.c 总结&#xff1a; 内存管理是一个系统基本组成部分&#xff0c;FreeRTOS 中大量使用到了内存管理&#xff0c;比如创建任务、信号量…

WPF中的Microsoft XAML Behaviors包功能详解

什么是XAML Behaviors(行为) XAML Behaviors 提供了一种简单易用的方法&#xff0c;能以最少的代码为 Windows UWP/WPF 应用程序添加常用和可重复使用的交互性。 但是Microsoft XAML Behaviors包除了提供常用的XAML Behaviors之外&#xff0c;还提供了一些Trigger&#xff08…

一文学习SpringBoot

一、SpringBoot介绍 (一)SpringBoot简介 Spring Boot 是由 Pivotal 团队提供的一个用于简化 Spring 应用初始搭建以及开发过程的框架。它基于 Spring 框架&#xff0c;旨在通过减少配置和简化开发流程来加速应用的开发和部署。Spring Boot 提供了嵌入式的 Tomcat、Jetty 或 Un…

本地小主机安装HomeAssistant开源智能家居平台打造个人AI管家

文章目录 前言1. 添加镜像源2. 部署HomeAssistant3. HA系统初始化配置4. HA系统添加智能设备4.1 添加已发现的设备4.2 添加HACS插件安装设备 5. 安装cpolar内网穿透5.1 配置HA公网地址 6. 配置固定公网地址 前言 大家好&#xff01;今天我要向大家展示如何将一台迷你的香橙派Z…

streamlit、shiny、gradio、fastapi四个web APP平台体验

streamlit、shiny、gradio、fastapi四个web APP平台体验 经常被问的问题就是&#xff1a;web APP平台哪个好&#xff1f;该用哪个&#xff1f;刚开始只有用streamlit和shiny&#xff0c;最近体验了一下gradio和fastapi&#xff0c;今天根据自己的体会尝试着回答一下。 使用R语…

Presto-简单了解-230403

presto是什么了解一下&#xff1a; 秒级查询引擎&#xff08;不做存储&#xff09;&#xff0c;GB-PB级不依赖于yarn&#xff0c;有自己的资源管理和执行计划支持多种数据源&#xff1a;hive、redis、kafka presto架构 presto优缺点 presto优点 内存到内存的传输&#xff0…

VScode 格式化代码空格记录

点击 -> “文件” -> “首选项" -> “设置” -> 按下图操作&#xff1a; 怎么格式化代码空格&#xff0c;先看下&#xff1a; 保存代码后&#xff0c;这代码自动格式化发&#xff0c;如下图&#xff1a; 你可以试试看就即可

HTML5 开关(Toggle Switch)详细讲解

HTML5 开关&#xff08;Toggle Switch&#xff09;详细讲解 1. 任务概述 开关&#xff08;Toggle Switch&#xff09;是一种用于表示二元状态&#xff08;如开/关&#xff09;的用户界面控件。用户可以通过点击开关来切换状态&#xff0c;常见于设置选项、开关功能等场景。 2…

Python中PDF转Word的技术

Python PDF转Word技术概述 在日常办公和数据处理中&#xff0c;经常需要将PDF文档转换为Word文档&#xff0c;以便进行编辑、修改或格式调整。Python作为一种强大的编程语言&#xff0c;提供了多种库和工具来实现这一功能。以下是对Python中PDF转Word技术的详细介绍。 一、技…

RabbitMQ中的异步Confirm模式:提升消息可靠性的利器

在现代分布式系统中&#xff0c;消息队列&#xff08;Message Queue&#xff09;扮演着至关重要的角色&#xff0c;它能够解耦系统组件、提高系统的可扩展性和可靠性。RabbitMQ作为一款广泛使用的消息队列中间件&#xff0c;提供了多种机制来确保消息的可靠传递。其中&#xff…

【深度学习】多目标融合算法—样本Loss提权

目录 一、引言 二、样本Loss提权 2.1 技术原理 2.2 技术优缺点 三、总结 一、引言 在朴素的深度学习ctr预估模型中&#xff08;如DNN&#xff09;&#xff0c;通常以一个行为为预估目标&#xff0c;比如通过ctr预估点击率。但实际推荐系统业务场景中&#xff0c;更多是多…

如何在谷歌浏览器中创建安全的密码

在数字化时代&#xff0c;网络安全变得日益重要。谷歌浏览器提供了多种工具和功能帮助用户创建和管理强密码&#xff0c;确保在线账户的安全。本文将简要介绍几种方法&#xff0c;帮助您在谷歌浏览器中创建和管理安全密码。 一、启用自动填充功能 确认密码保存功能已开启&…

一份完整的营销策划包含哪些内容?营销策划主要内容和流程--中小企实战运营和营销工作室博客

一份完整的营销策划包含哪些内容&#xff1f;营销策划主要内容和流程–中小企实战运营和营销工作室博客 在当今竞争激烈的市场环境中&#xff0c;营销策划成为企业取得成功的关键。一份完整的营销策划是企业实现市场目标的重要工具&#xff0c;它涵盖了多个方面的内容&#xff…

vscode-QT环境配置

vscode-QT环境配置 参考链接&#xff1a;https://www.cnblogs.com/RioTian/p/18281114 一、 背景 已经安装了QT软件&#xff0c;电脑里有了QT Creater 12.0。使用QT生成并运行了一个project在这个project的基础上&#xff0c;直接配置vscode的环境 二、环境配置 确认QT工程成…

[2025] 如何在 Windows 计算机上轻松越狱 IOS 设备

笔记 1. 首次启动越狱工具时&#xff0c;会提示您安装驱动程序。单击“是”确认安装&#xff0c;然后再次运行越狱工具。 2. 对于Apple 6s-7P和iPad系列&#xff08;iOS14.4及以上&#xff09;&#xff0c;您应该点击“Optinos”并勾选“允许未经测试的iOS/iPadOS/tvOS版本”&…

ARM64 Windows 10 IoT工控主板运行x86程序效率测试

ARM上的 Windows 10 IoT 企业版支持仿真 x86 应用程序&#xff0c;而 ARM上的 Windows 11 IoT 企业版则支持仿真 x86 和 x64 应用程序。英创推出的名片尺寸ARM64工控主板ESM8400&#xff0c;可预装正版Windows 10 IoT企业版操作系统&#xff0c;x86程序可无需修改而直接在ESM84…

万里数据库GreatSQL监控解析

GreatSQL是MySQL的一个分支&#xff0c;专注于提升MGR&#xff08;MySQL Group Replication&#xff09;的可靠性及性能。乐维监控平台可以有效地监控GreatSQL&#xff0c;帮助用户及时发现并解决潜在的性能问题。 通过在GreatSQL服务器上安装监控代理&#xff0c;收集数据库性…

【贪心算法】贪心算法七

贪心算法七 1.整数替换2.俄罗斯套娃信封问题3.可被三整除的最大和4.距离相等的条形码5.重构字符串 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f496;&#x1f496; 你的支持是对我最大的鼓励&#xff0c;我们一起努力吧!&#x1f603;&#x1f…

四年匠心磨砺,快手系统软件技术创新与领域演进之路

一、系统软件技术的核心价值与面临挑战 系统软件作为软件架构的基石&#xff0c;扮演着连接软件与硬件的桥梁角色&#xff0c;位于整个软件生态的最底层&#xff0c;处于关键核心的位置。系统软件最为显著的特征在于其规模效应&#xff0c;随着服务器体量的增加&#xff0c;系…

使用JMeter对Linux生产服务器进行压力测试

安装 JMeter wget https://downloads.apache.org/jmeter/binaries/apache-jmeter-5.4.1.tgz tar -xzf apache-jmeter-5.4.1.tgz cd apache-jmeter-5.4.1创建 JMeter 脚本 设置中文 选择Options—>Choose Language—>选择其他语言&#xff08;例如&#xff1a;Chinese&am…