【遍历】LeetCode二叉树的遍历、深度系列

news2024/11/27 12:49:05

文章目录

    • LeetCode题号
    • 104. 二叉树的最大深度
    • 111. 二叉树的最小深度
    • 144. 94. 二叉树的前序、中序遍历(DFS遍历)
    • 589. 589. N 叉树的前、后序遍历
    • 543. 二叉树的直径
    • 102. 二叉树的层序遍历

LeetCode题号

  • 简单 104. 二叉树的最大深度(DFS遍历法+分治)
  • 简单 111. 二叉树的最小深度(BFS)
  • 简单 144. 二叉树的前序遍历(DFS遍历)
  • 简单 94. 二叉树的中序遍历(DFS遍历)
  • 简单 589. N 叉树的前序遍历(DFS遍历)
  • 简单 590. N 叉树的后序遍历(DFS遍历)
  • 简单 543. 二叉树的直径(分治法)
  • 中等 102. 二叉树的层序遍历(BFS)

104. 二叉树的最大深度

在这里插入图片描述

方法1:DFS

class Solution {

	int maxDepth = 0;
	int depth = 1;
	public int maxDepth(TreeNode root) {
		traverse(root);
		System.out.println(depth);
		return maxDepth;
	}

	public void traverse(TreeNode root){
		depth++;
		if(root == null) {
			maxDepth = Math.max(maxDepth,depth);
			System.out.println(depth);
			return;
		}

		traverse(root.left);
		traverse(root.right);
		depth--;

	}
}

方法2:分治:

  1. 首先,检查根节点是否为空。如果为空,说明该二叉树为空树,最大深度为 0。因此,返回 0。
  2. 如果根节点不为空,递归地计算左子树和右子树的最大深度,并取两者中的较大值。
  3. 最后,将较大值加上1,作为当前节点的深度,返回给上层递归调用。
class Solution {
    public int maxDepth(TreeNode root) {
		if(root == null) return 0;
		return Math.max(maxDepth(root.left),maxDepth(root.right))+1;
    }
}

111. 二叉树的最小深度

在这里插入图片描述
BFS方法:使用了广度优先搜索(BFS)来遍历二叉树的每个节点,并找到最小深度。通过使用队列来存储待处理的节点,并每次取出队列中的第一个节点进行处理,直到找到叶子节点为止。时间复杂度为 O(n),其中 n 是二叉树中的节点数量。

class Solution {
	/**
	 * 函数 minDepth 接受一个二叉树的根节点 root 作为参数,并返回树的最小深度。
	 * @param root
	 * @return
	 */
    public int minDepth(TreeNode root) {
		// 边界条件:根节点为空直接返回
		if(root==null)return 0;

		int deep = 0;
		Queue<TreeNode> queue = new LinkedList<>();
		queue.add(root);
		deep++;

		while (!queue.isEmpty()){
			int qsize = queue.size();
			for (int i = 0; i < qsize; i++) {// 遍历下一层的每个节点
				TreeNode cur = queue.poll();
				// 找到第一个叶子节点,其深度即为答案
				if(cur.left==null&&cur.right==null){// 判断是否为叶子节点
					return deep;
				}

				if(cur.left!=null){
					queue.add(cur.left);
				}
				if(cur.right!=null){
					queue.add(cur.right);
				}
			}
			deep++; // 每一层的深度 + 1
		}
		return deep;
	}
}

144. 94. 二叉树的前序、中序遍历(DFS遍历)

DFS前序遍历:

class Solution {
	List<Integer> list = new ArrayList<>(); // 存储遍历结果
	
	public List<Integer> preorderTraversal(TreeNode root) {
		traverse(root);
		return list;
	}
	
	void traverse(TreeNode root){
		if(root == null)return;

		list.add(root.val); // 二叉树的前序遍历位置
		traverse(root.left);
		traverse(root.right);
	}
}

DFS中序遍历:

class Solution {
	List<Integer> list = new LinkedList<>();

    public List<Integer> inorderTraversal(TreeNode root) {
		traverse(root);
		return list;
    }
	void traverse(TreeNode root){
		if(root==null)return;

		traverse(root.left);
		list.add(root.val);// 二叉树的中序遍历位置
		traverse(root.right);
	}
}

589. 589. N 叉树的前、后序遍历

N叉树没有中序遍历,二叉树前中序遍历后都有。

DFS N叉树前序遍历:

class Solution {
	List<Integer> list = new LinkedList<>();
	public List<Integer> preorder(Node root) {
		DFS(root);
		return list;
	}

	public void DFS(Node root){
		if(root==null)return;

		list.add(root.val);        // 前序位置
		for(Node n:root.children){ // 二叉树是左右两个子树、N叉树是n个子树
			DFS(n);
		}
	}
}

DFS N叉树后序遍历:

class Solution {
	List<Integer> list = new LinkedList<>();
	public List<Integer> postorder(Node root) {
		DFS(root);
		return list;
	}

	public void DFS(Node root){
		if(root==null)return;

		for(Node n:root.children){
			DFS(n);
		}
		list.add(root.val);  // 后序位置
	}
}

543. 二叉树的直径

在这里插入图片描述
分治:计算每个节点的左右节点的深度之和,最大值即为答案。

class Solution {
	int finalRes = 0;

	public int diameterOfBinaryTree(TreeNode root) {
		int r = maxDepth(root);
		return finalRes;
	}

	int maxDepth(TreeNode root){
		if(root ==null){
			return 0;
		}

		int l = maxDepth(root.left); // 返回左节点的最大深度
		int r = maxDepth(root.right);// 返回右节点的最大深度

		// 后续遍历位置,计算当前左右节点最大深度之和
		int oneRes = l+r;// 当前节点的左右节点深度之和(直径)
		finalRes = Math.max(finalRes,oneRes); // 更新整棵树的最大直径

		return Math.max(l,r)+1;// 返回当前节点的最大深度

	}
}

102. 二叉树的层序遍历

在这里插入图片描述

BFS:

class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {

		List<List<Integer>> final_list = new ArrayList<List<Integer>>(); // 存放每一层的list
		if(root == null){
			return final_list;
		}

		Queue<TreeNode> queue = new LinkedList<TreeNode>();
		queue.offer(root);

		while (!queue.isEmpty()) {
			int queuesize = queue.size();
			List<Integer> list = new ArrayList<Integer>();
			for(int i =0; i < queuesize;i++){

				TreeNode node = queue.poll();
				list.add(node.val);

				if(node.left!=null){
					queue.offer(node.left);
				}
				if(node.right!=null){
					queue.offer(node.right);
				}
			}
			final_list.add(new ArrayList<Integer>(list));// 将每一层的结果放入最终结果中
		}
		return  final_list;
    }
}

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

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

相关文章

C# RotationDetector 图片旋转角度检测

效果 项目 VS2022.net4.8 OpenCvSharp4Sdcb.RotationDetector 代码 using OpenCvSharp; using Sdcb.RotationDetector; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using …

项目设计集合(人工智能方向):助力新人快速实战掌握技能、自主完成项目设计升级,提升自身的硬实力(不仅限NLP、知识图谱、计算机视觉等领域)

优质项目专栏&#xff1a;提升自身的硬实力&#xff1a;汇总有意义的项目设计集合&#xff0c;助力新人快速实战掌握技能&#xff0c;助力用户更好利用 CSDN 平台&#xff0c;自主完成项目设计升级&#xff0c;提升自身的硬实力。 专栏订阅&#xff1a;项目大全提升自身的硬实力…

2023MWC精彩回顾 | 未来数字世界中的社交,游戏与娱乐

6月28日至6月30日&#xff0c;由GSMA主办的2023 MWC 上海世界移动通信大会&#xff08;简称“MWC 上海”&#xff09;启幕。「Paraverse平行云」参与组织并主持了本次大会中【未来数字世界中的社交&#xff0c;游戏与娱乐】的主题会议。 「Paraverse平行云」携手上海交通大学、…

中国物流,驶入大航海时代

出海的一体化&#xff0c;不仅仅是物流的一体化&#xff0c;更是产业链、供应链的一体化。在诸多问题下&#xff0c;想要帮助企业更好地出海&#xff0c;就不能只专注于自身的长板&#xff0c;而是需要先补齐短板。 作者|斗斗 编辑|皮爷 出品|产业家 出海时代真的要来了。…

CSAPP fall2015 深入理解计算机系统 lab1 datalab详解

Data Lab data lab 数据实验 这个数据实验请在linux机器上面运行&#xff0c;实测mac m1本跑不起来。windows没试过。 centos上需要安装好gcc运行环境。 如果跑不起来记得安装下面这个东西&#xff1a; yum -y install glibc-devel.i686 运行make btest的时候可能会有warni…

药物设计学笔记:导论篇

笔记来自《药物设计学》 文章目录 1.药物设计概述 1.药物设计概述 药品&#xff08;medicine&#xff09; 药物&#xff08;durg&#xff09; 辅料&#xff0c;药物是研究对象 留意 medicine 和 drug 的区别 药物来源包括天然来源和人工来源&#xff0c;前者如吗啡&#xff0…

Oracle数据库软件安装与卸载

Oracle数据库软件安装与卸载 实验目的及要求 学习Oracle12c数据库服务器软件和客户端软件的安 装与卸载,掌握客户端服务名的设置,建立客户端与服务器的网络连接,熟悉windows操作系统中Oracle相关服务的操作。理解数据库管理的基本架构。 &#xff08;1&#xff09;熟悉Oracle…

网讯wx1860接yt8521phy千兆网口调试

问题描述&#xff1a;网讯1860接yt8521phy出一路电口和3路光口都不通。 问题分析&#xff1a;影响网口不通一般有三个因素导致&#xff1a;固件、驱动、硬件。 固件&#xff1a;对于网口不通一般先确认固件是否烧写正确&#xff0c;咨询网讯FAE后将固件更新为&#xff1a;SF4…

人物建模软件是一种通过计算机技术和人工智能算法将真实人物可视化的创新工具

这种软件可以将现实中的人物形象转化为数字模型&#xff0c;使其在虚拟世界中栩栩如生。使用人物建模软件&#xff0c;用户可以轻松地创建自己或其他人的数字化人物形象&#xff0c;并赋予其丰富的人工智能功能。 人物建模软件具备高度的灵活性和逼真的效果。它可以通过多种方…

mysql 关于用户的练习

环境&#xff1a; (1) 创建用户 create user account1localhost identified by oldpwd1; 授予权限&#xff1a; #给表授予权限 grant select,insert on Team.player to account1localhost identified by oldpwd1;#给info字段授予update权限 grant update(info) on Team.pl…

WebDAV之π-Disk派盘+WPS

WPS 支持WebDAV方式连接葫芦儿派盘。 WPS Office是一款常用的办公软件&#xff0c;可以方便地编辑、查看和分享文字文档、电子表格和演示文稿等文件。而派盘则是一款本地私有云产品&#xff0c;可以将您的本地硬盘变成云存储空间&#xff0c;提供高效的文件存储、分享、同步和…

Jenkins2.4.0.2集成sonarqube9.9和sonar scanner

本文的前提是服务器部署好了 Jenkins和sonqube 代码可以手动推送到sonqube 现在我只实现了自动推代码 以及遇到的问题 解决方法 分为三步 都是在Jenkins配置 1 在全局环境配置 sonarqube &#xff08;配置身份&#xff0c;代你登录&#xff09; 2 在工具处配置sonar sca…

zabbix的客户机,监控内容,自动发现

zabbix 一&#xff1a;添加 zabbix 客户端主机1.服务端和客户端都配置时间同步2.服务端和客户端都设置 hosts 解析3.设置 zabbix 的下载源&#xff0c;安装 zabbix-agent24.修改 agent2 配置文件5.启动 zabbix-agent26.在服务端验证 zabbix-agent2 的连通性7.常用的键值8.在 We…

正大国际期货:甲醇期货有哪些投资优点?

甲醇期货市场有哪些投资优点&#xff1f; 甲醇期货市场的投资优点有三点&#xff1a;1、价格较低。甲醇期货实行保证金交易制度&#xff0c;降低了甲醇期货交易成本&#xff0c;也让更多投资者可以进行甲醇期货的交易。交易者只需要用10%的保证金就可从事100%的远期贸易、发挥…

初阶C语言——详解操作符(1)

Hello,我们又见面了&#xff0c;最近不知道大家是否在持续输出代码呢&#xff1f;代码能力是否提高了呢&#xff1f;今天让我们来一起学习操作符&#xff0c;操作符在我们学习语言中很重要&#xff0c;我们要知道每个操作符的作用和用法&#xff0c;下面开始我们的学习。 操作符…

yaml语言入门(YAML Ain‘t Markup Language)

文章目录 YAML为什么YAML强调自己不是一种标记语言&#xff1f;YAML文件与HTML、XML、JSON标记语言的异同 YAML的基本语法代码示例python解析yaml示例示例1示例2 python组包yaml示例 其他问题yaml中的引用的作用和用法 YAML YAML&#xff08;YAML Ain’t Markup Language 强调…

【Spring boot+VUE2+Android 7.1】智慧校园源码

一、智慧校园实现了智慧校园基础数据的统一管理&#xff0c;通过此平台提供教师基础信息管理、学生基础信息管理、用户认证管理、权限管理、资源管理、应用管理、第三方应用接入等基础功能与服务。 二、源码包含&#xff1a;电子班牌管理系统、成绩管理系统、考勤人脸刷卡管理系…

小马识途谈人物百科创建流程和技巧

百度百科通过搜集、整理和展示各种知识和信息&#xff0c;为人们提供了一个方便的查找和了解世界的平台。它的价值在于帮助人们获取知识和信息&#xff0c;并促进了知识的传播和共享。此外&#xff0c;百度百科还为学者、研究人员、教育工作者和一般公众提供了一个交流和分享知…

移动硬盘怎么加密?移动硬盘设置密码的方法

在工作中&#xff0c;我们经常需要使用移动硬盘来储存大量重要数据&#xff0c;而为了保护数据安全&#xff0c;我们则需要采用加密的方法来保护移动硬盘的安全。那么移动硬盘该怎么加密呢&#xff1f;下面我们就来了解两种移动硬盘加密的方法。 常规方法 我们可以使用BitLock…

计算机网络期末复习题(华南理工mooc习题及解答)

目录 &#x1f389;第一章 概述&#x1f389; &#x1f389;第二章 物理层&#x1f389; &#x1f389;第三章 数据链路层&#x1f389; &#x1f389;第四章 网络层&#x1f389; &#x1f389;第五章 运输层&#x1f389; &#x1f389;第六章 应用层&#x1f389; &am…