代码随想录(二叉树)

二叉树的递归遍历

class Solution {public List<Integer> preorderTraversal(TreeNode root) {List<Integer> list = new ArrayList<>();if(root==null) {return list;}else {traversal(list,root);}return list;}public void traversal(List<Integer> list,TreeNode root) {if(root==null) {return;}//前中后序调整一下下面的顺序即可list.add(root.val);traversal(list,root.left);traversal(list,root.right);}
}

二叉树的迭代遍历

思路 以中序为扩展,其他的改变顺序即可  中序—左中右  栈—右中左1、先入栈根结点2、弹出第一个,因为我们每次先拿到的都是子树的中结点3、右结点入栈  中结点入栈并打上标记null  左结点入栈  4、遇见null结点则弹出两次 第二次的值入列表
class Solution {public List<Integer> inorderTraversal(TreeNode root) {List<Integer> list = new ArrayList<>();Deque<TreeNode> de = new LinkedList<>();if(root==null){return list;}else{de.addLast(root);}while(!de.isEmpty()){TreeNode node = de.peekLast();if(node!=null){  de.pollLast();if(node.right!=null){  //右de.addLast(node.right);}de.addLast(node);  //中de.addLast(null);if(node.left!=null){ //左de.addLast(node.left);}}else{de.pollLast();node = de.peekLast();de.pollLast();list.add(node.val);}}return list;}
}

二叉数的层序遍历(Leetcode102)

思路1、根结点入队  用int size = de.size() 可以了解到这一层有几个结点2、每层遍历到的结点考虑他的左右结点,如果有结点则入队 先左后右3、这一层遍历到的size个结点加入到arr中 这一层遍历完后再加入到list中
public List<List<Integer>> levelOrder(TreeNode root) {List<List<Integer>> list = new ArrayList<>();Deque<TreeNode> de = new LinkedList<>();if(root==null) {return list;}else {de.add(root);}while(!de.isEmpty()) {int size = de.size();List<Integer> arr = new ArrayList<>();for(int i = 0;i<size;i++) { TreeNode temp = de.pollFirst();if(temp.left!=null) {de.addLast(temp.left);}if(temp.right!=null) {de.addLast(temp.right);}arr.add(temp.val);}list.add(arr);}return list;}

二叉树的层序遍历2(Leetcode107)

思路 先层序遍历 再把顺序颠倒一下即可  Collections.reverse(list); 可以改变集合顺序
public List<List<Integer>> levelOrderBottom(TreeNode root) {List<List<Integer>> list = new ArrayList<>();Deque<TreeNode> de = new LinkedList<>();if(root==null) {return list;}else {de.add(root);}while(!de.isEmpty()) {int size = de.size();List<Integer> arr = new ArrayList<>();while(size-->0) {TreeNode temp = de.pollFirst();if(temp.left!=null) {de.add(temp.left);}if(temp.right!=null) {de.add(temp.right);}arr.add(temp.val);}list.add(arr);}Collections.reverse(list);return list;}

二叉树的右视图(Leetcode199)

思路:每次把每一层最后一个结点的值加入列表即可 也是层序
public List<Integer> rightSideView(TreeNode root) {List<Integer> list = new ArrayList<>();Deque<TreeNode> de = new LinkedList<>();if(root==null) {return list;}else {de.add(root);}while(!de.isEmpty()) {int size = de.size();for(int i = 0;i<size;i++) {TreeNode temp = de.pollFirst();if(i==(size-1)){  //判断是不是当前层最后一个结点list.add(temp.val);}if(temp.left!=null) {de.addLast(temp.left);}if(temp.right!=null) {de.addLast(temp.right);}}}return list;}

二叉树的层平均值(Leetcode637) 

class Solution {public List<Double> averageOfLevels(TreeNode root) {List<Double> result = new LinkedList<>();Deque<TreeNode> de = new LinkedList<>();if(root==null) {return result;}de.add(root);while(!de.isEmpty()){int size = de.size();int sum = size;double num = 0;while(size-->0){TreeNode temp = de.pollFirst();num += temp.val;if(temp.left!=null){de.addLast(temp.left);}if(temp.right!=null){de.addLast(temp.right);}}double total = num/sum;result.add(total);}return result;
}
}

N叉树的层序遍历(Leetcode429)


class Solution {public List<List<Integer>> levelOrder(Node root) {List<List<Integer>> result = new LinkedList<>();Deque<Node> de = new LinkedList<>();if(root == null) {return result;}de.add(root);while(!de.isEmpty()) {int size = de.size();List<Integer> list = new LinkedList<>();while(size-->0){Node temp = de.pollFirst();list.add(temp.val);if(temp.children!=null){  //判断是不是有子结点,有的话全部入队for(int i = 0;i<temp.children.size();i++){de.addLast(temp.children.get(i));}}}result.add(list);}return result;}
}

每个树行中找最大值(Leetcode515)

class Solution {public List<Integer> largestValues(TreeNode root) {List<Integer> result = new LinkedList<>();Deque<TreeNode> de = new LinkedList<>();if(root==null) {return result;}de.add(root);while(!de.isEmpty()){int size = de.size();int max = Integer.MIN_VALUE;while(size-->0){TreeNode temp = de.pollFirst();max = max>temp.val?max:temp.val; //判断是不是当前层最大的if(temp.left!=null){de.addLast(temp.left);}if(temp.right!=null){de.addLast(temp.right);}}result.add(max);}return result;}
}

 填充每个节点的下一个右侧节点(Leetcode116/117)

思路1、一先创建一个虚拟指针指向root ,用这个指针来操控即可,就不会影响影响到root2、层序遍历3、判断每层的最后一个都指向null 前面的按照队列顺序指向
public Node connect(Node root) {Deque<Node> de = new LinkedList<>();if(root==null) {return root;}else {Node cur = root;de.add(cur);}while(!de.isEmpty()) {int size = de.size();for(int i = 0;i<size;i++) {Node temp = de.pollFirst();if(!de.isEmpty()&&de.peekFirst()!=null&&i!=(size-1)) { //除了最后一个节点外 弹出的指向弹出后的队首temp.next = de.peekFirst();}else {temp.next = null;}if(temp.left!=null) {de.addLast(temp.left);}if(temp.right!=null) {de.addLast(temp.right);}}}return root;}

翻转二叉树(Leetcode226)

思路1、定义一个函数来交换左右节点2、遍历节点,每遍历一个节点交换一次
class Solution {
public TreeNode invertTree(TreeNode root) {Deque<TreeNode> de = new LinkedList<>();if(root==null) {return root;}else {de.add(root);}while(!de.isEmpty()) {int size = de.size();for(int i = 0;i<size;i++) {TreeNode temp = de.pollFirst();if(temp.left!=null) {de.addLast(temp.left);}if(temp.right!=null) {de.addLast(temp.right);}SwapNode(temp);}}return root;}public void SwapNode(TreeNode root) {TreeNode temp = root.left;root.left = root.right;root.right = temp;}
}

对称二叉树(Leetcode101)

思路:1、根节点的左右节点入队2、每次判断左右节点的外侧和内侧节点是否相同3、左右节点的内外侧节点入队
public boolean isSymmetric(TreeNode root) {Deque<TreeNode> de = new LinkedList<>();if(root==null){return true;}else {de.add(root.left);de.add(root.right);}while(!de.isEmpty()) {TreeNode node1 = de.pollFirst();TreeNode node2 = de.pollFirst();if(node1==null&&node2!=null) {return false;}if(node2==null&&node1!=null) {return false;}if(node1==null&&node2==null){continue;}if(node1.val!=node2.val) {return false;}de.add(node1.left);de.add(node2.right);de.add(node1.right);de.add(node2.left);}return true;}

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

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

相关文章

如何培养元技能?

如何培养元技能&#xff1f; 一、引言 在当今社会&#xff0c;仅仅依靠某一专业技能是远远不够的。我们需要拓宽自己的能力和视野&#xff0c;从而更好地应对日新月异的社会发展和工作需求。在这个过程中&#xff0c;培养元技能变得至关重要。元技能不仅有助于我们在各个领域中…

【全开源】驾校管理系统源码(FastAdmin+ThinkPHP)

一款基于FastAdminThinkPHP开发的驾校管理系统&#xff0c;驾校管理系统(DSS)主要面向驾驶学校实现内部信息化管理&#xff0c;让驾校管理者和工作人员更高效、更快捷的完成枯燥无味的工作&#xff0c;让工作更有条理。改变驾校传统的手工或半手工Excel文档管理的工作方式。多驾…

JavaScript数据类型;属性,对象,方法;var,let,const,局部变量,全局变量

JavaScript数据类型&#xff1a; 值类型(基本类型)&#xff1a;字符串&#xff08;String&#xff09;、数字(Number)、布尔(Boolean)、空&#xff08;Null&#xff09;、未定义&#xff08;Undefined&#xff09;、Symbol。 引用数据类型&#xff08;对象类型&#xff09;&a…

PG主从切换

文章目录 一、 不再需要配置recovery.conf文件二、 备库执行基础备份时新的命令行选项-R三、 如何生成standby.signal文件四、初次主备切换流程1、主库停止2、备库提升为新主库&#xff0c;对外提供服务3、新主库修改pg_hba.conf文件4、原主库新建$PGDATA/standby.signal文件5、…

嵌入式进阶——HID协议

&#x1f3ac; 秋野酱&#xff1a;《个人主页》 &#x1f525; 个人专栏:《Java专栏》《Python专栏》 ⛺️心若有所向往,何惧道阻且长 文章目录 USB烧录USB HID协议USB协议组成通讯流程 官方USB HID范例文件说明修改PC端的显示 兼容库函数HID键盘USB调试工具USB 描述符设备描述…

mysql登录报错 Client does not support authentication protocol requested by server

mysql登录报错 Client does not support authentication protocol requested by server 在使用 MySQL 数据库时&#xff0c;你可能会遇到以下错误消息&#xff1a; ERROR 1251 (08004): Client does not support authentication protocol requested by server; consider upgr…

【数据结构与算法 | 栈 + 队列篇】力扣232, 225

1. 力扣232 : 用栈实现队列 (1). 题 请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作&#xff08;push、pop、peek、empty&#xff09;&#xff1a; 实现 MyQueue 类&#xff1a; void push(int x) 将元素 x 推到队列的末尾int pop() 从队列的开头移…

suse xen内核安装启动失败问题

Error 15 /boot/xen.gz not found Filesystem type is ext2fs, partition type 0x83 Error 15 原因&#xff1a; 除了安装以下三个安装包 -rw-r--r-- 1 root root 23362981 Jun 14 2013 kernel-xen-3.0.76-0.11.1.x86_64.rpm -rw-r--r-- 1 root root 14158930 Jun 14 20…

Anaconda -> Anaconda支持什么编程语言的环境配置

Anaconda是一个数据科学和机器学习的开发环境&#xff0c;它支持多种编程语言的环境配置&#xff0c;包括&#xff1a; Python&#xff1a;Anaconda默认安装了Python和必需的Python库&#xff0c;可以方便地进行Python编程和数据分析。 R&#xff1a;Anaconda也可以配置R语言环…

MFC工控项目实例之一主菜单制作

1、本项目用在WIN10下安装的vc6.0兼容版实现。创建项目名为SEAL_PRESSURE的MFC对话框。在项目res文件下添加相关256色ico格式图片。 2、项目名称&#xff1a;密封压力试验机 主菜单名称&#xff1a; 系统参数 SYS_DATA 系统测试 SYS_TEST 选择型号 TYP_CHOICE 开始试验 TES_STA…

【参会通知】第四届电子、信息与计算技术前沿国际会议

尊敬的学者/专家&#xff1a; 您好&#xff01; 我们诚挚地邀请您参与2024年电子、信息与计算技术前沿国际会议&#xff08;ICFEICT 2024&#xff09;。会议将于2024年6月22日-6月25日在北京召开。ICFEICT 2024旨在为来自国内外高等院校、科研院所、企事业单位的专家、教授、…

SAP_SD模块 物料科目分配/成本简介

SAP系统各模块与财务都有个方面的集成。文本主要说明销售模块中的科目分配和成本的一个对应关系。 1、首先是在物料主数据上销售视图中的物料科目分配组&#xff0c;S1主营、S2材料等字段&#xff0c;物料销售的时候会将这个物料产生的记录到对应的科目中。 首先是物料主数据中…

pip更新网络问题:Exception: Traceback (most recent call last): File

报错&#xff1a;rootdebian01:~# pip3.9 install --upgrade pip Collecting pip Downloading pip-24.0-py3-none-any.whl (2.1 MB) |██████████████████▉ | 1.2 MB 5.5 kB/s eta 0:02:39ERROR: Exception: Traceback (most recent call last): File “/usr…

利用cython将.py文件编译为.pyd文件

文章目录 1. 引言2. py文件编译为pyd文件步骤2.1 环境准备2.2 准备setup.py文件2.3 进行编译 3. 测试代码 1. 引言 在实际的Python开发中&#xff0c;为了防止Python脚本源码暴露&#xff0c;常常需要对python源码文件进行加密保护&#xff0c;Python的原始文件格式为.py&…

在outlook的邮件中插入HTML;HTML模板获取;页面组态手动生成HTML

本文介绍如何在outlook发送邮件时&#xff0c;在邮件中插入HTML&#xff0c;此HTML可以从获取模板自行进行修改。 文章目录 一、下载HTML模板&#xff08;或自己制作好HTML文件&#xff09;二、outlook新增宏三、新建邮件&#xff0c;插入HTML四、通过图像化页面组态手动生成HT…

做场外个股期权怎么询价

做场外个股期权怎么询价&#xff1f;没有具体的哪家做市商是询价是最低的&#xff0c;个人投资者需要通过机构通道方询价进行对比&#xff0c;各券商的报价由询价机构方提供给到投资者&#xff0c;可以参考不同券商的报价进行比对&#xff0c;再决定是否进行投资。本文来自&…

操作系统复习-操作系统概述

操作系统概述 操作系统的基本功能 操作系统统一管理着计算机资源&#xff1a; 处理器资源IO设备资源存储器资源文件资源 操作系统实现了对计算机资源的抽象&#xff1a; 用户无需向硬件接口编程IO设备管理软件&#xff0c;提供读写接口文件管理软件&#xff0c;提供操作文…

关于验证码的那些漏洞

一、短信轰炸 这类漏洞存在的原因是没有对短信验证码的发送时间、用户及其IP作一些限制。 案例1、正常的短信轰炸 burp一直发包即可 案例2、并发绕过 做了限制咋办&#xff1f;可以试试并发(万物皆可并发) 使用turbo intruder插件进行并发。 并发次数越大是不是轰炸就越多。 …

宝塔安装java环境Jdk1.8

1.打开宝塔——选择“终端”——输入SSH的服务器IP和SSH账号&#xff0c;选择密码验证&#xff0c;输入密码 2。登录成功后&#xff0c;输入&#xff1a;yum list java-1.8*&#xff0c;用于列出所有与 “java-1.8” 相关的软件包 yum list java-1.8* 3.安装Jdk1.8: yum insta…

[leetcode hot150]第二百三十六题,二叉树的最近公共祖先

题目&#xff1a; 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个节点 p、q&#xff0c;最近公共祖先表示为一个节点 x&#xff0c;满足 x 是 p、q 的祖先且 x 的深度尽可能大&#xff08;一个…