Leetcode 二叉树详解

news2024/11/27 8:34:51

二叉树

树的概念及基本术语见树与二叉树的基础知识

定义:一棵二叉树是结点的一个有限集合,该集合或者为空,或者是由一个根结点加上两棵分别称为左子树和右子树的、互不相交的二叉树组成。
特点:每个结点至多只有两棵子树(二叉树中不存在度大于2的结点)
性质:二叉树的五大性质及证明
五种形态:

在这里插入图片描述

Leetcode 真题

二叉树遍历

二叉树的中序遍历

解题思路:先遍历左子树,然后访问根结点,最后遍历右子树

public static List<Integer> values;
public List<Integer> inorderTraversal(TreeNode root) {
	values = new ArrayList<>();
	inOrder(root);
	return values;
}

private void inOrder(TreeNode root) {
	if (root != null) {
		inOrder(root.left);
		values.add(root.val);
		inOrder(root.right);
	}
}

二叉树的前序遍历

解题思路:先访问根结点,然后遍历左子树,最后遍历右子树

List<Integer> values;
public List<Integer> preorderTraversal(TreeNode root) {
	values = new ArrayList<>();
	preorder(root);
	return values;
}

private void preorder(TreeNode root){
	if(root != null){
		values.add(root.val);
		preorder(root.left);
		preorder(root.right);
	}
}

二叉树的后序遍历

解题思路:先遍历左子树,然后遍历右子树,最后访问根结点

List<Integer> values;
public List<Integer> postorderTraversal(TreeNode root) {
	values = new ArrayList<>();
	postorder(root);
	return values;
}

private void postorder(TreeNode root){
	if(root != null){
		postorder(root.left);
		postorder(root.right);
		values.add(root.val);
	}
}

二叉树的层序遍历

解题思路:自上而下,自左至右逐层访问树的结点的过程就是层序遍历

public List<List<Integer>> levelOrder(TreeNode root) {
	Queue<TreeNode> queue = new LinkedList<>();
	List<List<Integer>> values = new ArrayList<>();
	if(root == null){
		return values;
	}

	queue.add(root);
	while(!queue.isEmpty()){
		int size = queue.size();
		List<Integer> level = new ArrayList<>();
		for (int i = 0; i < size; i++) {
			TreeNode node = queue.remove();
			level.add(node.val);
			if (node.left != null) {
				queue.add(node.left);
			}
			if (node.right != null) {
				queue.add(node.right);
			}
		}
		values.add(level);
	}
	return values;
}

二叉树递归

二叉树的最大深度

解题思路:分解为子问题再进行递归,节点的最大深度 = 左子树与右子树的最大深度 + 1

public int maxDepth(TreeNode root) {
	return root == null ? 0 : 1 + Math.max(maxDepth(root.left), maxDepth(root.right));
}

路径总和

解题思路:
问题分解为子问题:假定从根节点到当前节点的值之和为 val,查找是否存在从当前节点的子节点到叶子的路径,满足其路径和为 sum - val

public boolean hasPathSum(TreeNode root, int sum) {
	if (root == null) {
		return false;
	}
	if (root.left == null && root.right == null) {
		return sum == root.val;
	}
	return hasPathSum(root.left, sum - root.val) || hasPathSum(root.right, sum - root.val);
}

路径总和 II

解题思路:
同[路径总和],将问题分解为子问题:假定从根节点到当前节点的值之和为 val,查找是否存在从当前节点的子节点到叶子的路径,满足其路径和为 sum - val
区别为需记录结果集

List<List<Integer>> res = new ArrayList<>();
public List<List<Integer>> pathSum(TreeNode root, int targetSum) {
    LinkedList<Integer> path = new LinkedList<>();
    dfs(root, targetSum, path);
    return res;
}

public void dfs(TreeNode root, int targetSum, LinkedList<Integer> path) {
    if (root == null) {
        return;
    }
    targetSum -= root.val;
    path.add(root.val);
    if (targetSum == 0 && root.left == null && root.right == null) {
        res.add(new LinkedList(path));
    }
    dfs(root.left, targetSum, path);
    dfs(root.right, targetSum, path);
    path.removeLast();
}

参考资料:

  1. 树、二叉树及二叉查找树
  2. 树与二叉树的基础知识

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

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

相关文章

Vivado综合属性系列之八 DIRECT_ENABLE DIRECT_RESET

目录 一、前言 二、DIRECT_ENABLE、DIRECT_RESET ​ ​2.1 属性说明 ​ ​2.2 工程代码 ​ ​2.3 综合结果 一、前言 在Vivado 2019之前的版本中&#xff0c;对于设计中触发器的使能端口和复位端口是会自动接地&#xff0c;如果需要接设计端口&#xff0c;如果要直连…

GitHub Copilot开发者酷游网址训练营

目标读者 已使用且【酷游网K͜W͜98典neт娜娜宝宝提供】想发挥GitHub Copilot所有潜能的使用者想知道GitHub Copilot未来展望的使用者想了解GitHub Copilot能力的开发者 简介 最近Open AI带起的新世代&#xff0c;热潮汹涌&#xff0c;一堆AI工具蜂拥而至(如:chatGPT和Midjo…

近期关于Transformer结构有潜力的改进方法总结

目录 0 引言1 Gated Linear Unit (GLU)1.1 思路 2 Gated Attention Unit (GAU)2.1 思路2.2 实验结论2.3 混合注意力 3 FlashAttention3.1 标准Attention的实现3.2 FlashAttention的实现针对目标1针对目标2 4 总结5 参考资料 0 引言 标准Transformer在最新的实际大模型中并没有…

C++STL算法篇之集合算法

CSTL算法篇之集合算法 集合算法set_union(并集)set_difference(差集)set_intersection(交集)set_symmetric_difference(对称差集) 集合算法 当然最好还是要包含 functional algorithm 这2个头文件 集合算法有4个函数 1.set_union 交集 2.set_difference 差集 3.set_intersectio…

安卓开发多选列表和回显已选择内容

问题背景 安卓日常开发和学习过程中&#xff0c;经常会碰到需要多选列表和显示已选择内容的场景&#xff0c;本文将介绍安卓实现多选列表和回显已选择内容的一种方案。 问题分析 话不多说&#xff0c;先上效果&#xff1a; 思路分析&#xff1a; 一个纵向列表显示待选择内…

多线程基础(二)CAS无锁优化/自旋锁/乐观锁、ABA问题

CAS &#xff08;Compare And Set&#xff09;比较并替换 上篇文章的锁问题解决&#xff0c;可以使用更高效的方法&#xff0c;使用AtomXXX类&#xff0c;AtomXXX类本身方法都是原子性的&#xff0c;但不能保证多个方法连续调用是原于性的。 import java.util.ArrayList; imp…

chatgpt赋能Python-pythoncd

Python介绍 Python是一种流行的高级编程语言&#xff0c;由Guido van Rossum于1989年开发。Python的设计目标是简单易学、易于阅读和编写&#xff0c;同时也是一种高效的语言&#xff0c;能够处理各种不同的任务。Python在Web开发、数据分析、人工智能和科学计算等领域得到广泛…

chatgpt赋能Python-pythoncalendar

PythonCalendar&#xff1a;Python中优秀的日期处理库 作为一门快速发展的编程语言&#xff0c;Python提供了许多优秀的库和工具&#xff0c;用于方便程序员进行各种各样的操作和处理。其中&#xff0c;日期处理是一个必不可少的模块。PythonCalendar库就是Python中优秀的日期…

ChatGPT 的 AskYourPDF 插件所需链接如何获取?

一、背景 目前 ChatGPT 主要有两款 PDF 对话插件&#xff0c;一个是 AskYourPDF 一个是 ChatWithPDF&#xff08;需 ChatGPT Plus&#xff09;&#xff0c;他们都可以实现给一个公共的PDF 链接&#xff0c;然后进行持续对话&#xff0c;对读论文&#xff0c;阅读 PDF 格式的文…

Godot引擎 4.0 文档 - 循序渐进教程 - 创建实例

本文为Google Translate英译中结果&#xff0c;DrGraph在此基础上加了一些校正。英文原版页面&#xff1a; Creating instances — Godot Engine (stable) documentation in English 创建实例 在前面的部分中&#xff0c;我们看到场景是以树结构组织的节点集合&#xff0c;以…

【中间件】通过 docker-compose 快速部署 Kafka 保姆级教程

文章目录 一、概述二、前期准备1&#xff09;部署 docker2&#xff09;部署 docker-compose 三、创建网络四、安装 Zookeeper五、Kafka 编排部署1&#xff09;下载 Kafka2&#xff09;配置3&#xff09;启动脚本 bootstrap.sh4&#xff09;构建镜像 Dockerfile5&#xff09;编排…

【VMware】搭建个人服务器

文章目录 准备工作三种网络模式Bridged(桥接模式)定义设置 NAT(网络地址转换模式)定义设置 Host-Only(仅主机模式)定义设置 搭建服务器网络模式的选择在VMWare的网络编辑器中设置转发端口查看宿主机的ip地址使用ssh连接工具进行连接 Mac笔记本跑虚拟机总感觉别扭&#xff0c;通…

浅谈一下“近期强势”这个指数

最近的行情,如果不理解退潮,那就意味着完全不理解情绪周期,也自然对大周期和小周期的概念了,这样一来无论你嘴上套用什么分歧、一致、修复都是徒劳的。 我说过我定义的新周期开始到结束,为什么我能定义一个很长的大周期?因为我有办法去观察赚钱效应。 如果我们都能理解…

【分布式锁】Redisson分布式锁底层原理

文章目录 前言原理分析Redisson实现Redis分布式锁的底层原理1.加锁机制2.锁互斥机制3. watch dog自动延期机制4.可重入加锁机制5.释放锁机制6.上述Redis分布式锁的缺点 前言 现在最流行的redis分布式锁就是Redisson了&#xff0c;来看看它的底层原理就了解redis是如何使用分布…

真香,聊聊 RocketMQ 5.0 的 POP 消费模式!

大家好&#xff0c;我是君哥。 大家都知道&#xff0c;RocketMQ 消费模式有 PULL 模式和 PUSH 模式&#xff0c;不过本质上都是 PULL 模式&#xff0c;而在实际使用时&#xff0c;一般使用 PUSH 模式。 不过&#xff0c;RocketMQ 的 PUSH 模式有明显的不足&#xff0c;主要体…

Unity 过场工具(Cutscene)设计(四) ——组件化设计

Unity 过场工具(Cutscene)设计&#xff08;四&#xff09; ——组件化设计 写到这一篇文章前就开始在考虑如何才能说清楚自己的设计思路&#xff0c;因为后续涉及到编辑器和Runtime框架的实际设计和实现过程&#xff0c;两者之间是互相有设计因果关系的。为了阐述自己的核心设计…

从0.5开始开发一个导购网站

提醒&#xff1a;文中没有具体如何修改的代码&#xff0c;只是提供了修改的思路。 为什么是从0.5开始呢&#xff1f; 因为这里借助了一个大佬的开源项目Springboot项目仿天猫商城: Springboot项目仿天猫商城 前台jsp页面 大佬的代码简洁&#xff0c;没有什么多余的功能&…

系统调用与API

系统调用介绍 什么是系统调用 为了让应用程序有能力访问系统资源&#xff0c;也为了让程序借助操作系统做一些由操作系统支持的行为&#xff0c;每个操作系统都会提供一套接口&#xff0c;以供应用程序使用。系统调用涵盖的功能很广&#xff0c;有程序运行所必需的支持&#xf…

leetCode刷题记录2

文章目录 hot100题560. 和为 K 的子数组581. 最短无序连续子数组 ▲617. 合并二叉树 hot100题 560. 和为 K 的子数组 560. 和为 K 的子数组 先暴力&#xff0c;过了再说 public int subarraySum(int[] nums, int k) {int ans 0;for (int i 0; i < nums.length; i) {in…

保姆级教程Windows11下安装RocketMQ

一、RocketMQ介绍 RocketMQ 是阿里巴巴开源的分布式消息中间件。支持事务消息、顺序消息、批量消息、定时消息、消息回溯等。它里面有几个区别于标准消息中件间的概念&#xff0c;如Group、Topic、Queue等。系统组成则由Producer、Consumer、Broker、NameServer等。 二、Rock…