动态规划、DFS 和回溯算法:二叉树问题的三种视角

动态规划、DFS 和回溯算法:二叉树问题的三种视角

在计算机科学中,算法是解决问题的核心。特别是对于复杂的问题,不同的算法可以提供不同的解决方案。在本篇博客中,我们将探讨三种算法:动态规划、深度优先搜索(DFS)和回溯算法,它们如何从不同的角度解决以二叉树为基础的问题。

二叉树问题的核心

二叉树是一种非常基础的数据结构,在许多算法问题中都会遇到。一个二叉树由节点和连接节点的边组成,每个节点最多有两个子节点。在解决二叉树问题时,我们通常需要考虑节点的值、树的结构、节点间的关系等因素。

动态规划

动态规划(Dynamic Programming, DP)是解决优化问题的一种方法。它将一个复杂问题分解成一系列子问题,并存储子问题的解,以避免重复计算。在二叉树问题中,动态规划通常关注整棵子树。

动态规划的关注点:子树

当我们使用动态规划解决二叉树问题时,我们通常从叶子节点开始,向上逐步构建解决方案。每个节点都代表了一个子问题的解,而这个解通常依赖于其子节点的解。通过这种方式,我们可以构建出整棵树的解。

例子:二叉树的最大路径和

假设我们要找到一棵二叉树中的最大路径和。在这个问题中,路径可以从任何节点开始,到任何节点结束,但必须沿着树的边行进。这是一个典型的可以用动态规划解决的问题。

我们可以为每个节点定义一个状态,表示“以该节点为根的子树中,从该节点出发的最大路径和”。然后,我们可以用递归的方式,从叶子节点向根节点递推,最终得到整棵树的最大路径和。

/*** 二叉树的直径* 给你一棵二叉树的根节点,返回该树的 直径 。** 二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。** 两节点之间路径的 长度 由它们之间边数表示。* @param root* @return*/public int diameterOfBinaryTree(TreeNode root) {deep(root);return maxDeep - 1;}private int deep(TreeNode root){if(root==null){return 0;}int l = deep(root.left);int r = deep(root.right);maxDeep = Math.max(maxDeep,l+r+1);return 1 + Math.max(l, r);}

回溯算法

回溯算法是一种通过试错来找到所有/部分解决方案的算法。它的工作原理是逐步构建解决方案,并在发现当前解决方案无法成功时,取消上一步或几步的计算,再尝试其他可能的解决方案。

回溯算法的关注点:树枝

回溯算法在二叉树问题中关注的是“树枝”,即从根节点到叶子节点的路径。在构建解决方案的过程中,回溯算法会遍历这些路径,尝试所有的可能性,并在遇到死胡同时回退。

例子:二叉树的所有路径

例如,如果我们要找到一棵二叉树的所有根到叶子的路径,回溯算法就非常适合。我们从根节点开始,记录下路径,然后递归地探索左右子节点。如果到达叶子节点,就记录下完整的路径。如果递归返回,我们就撤销当前步骤,尝试其他选项。

List<List<Integer>> resultAll = new ArrayList<>();public List<List<Integer>> binaryTreePaths(TreeNode root) {List<Integer> result = new ArrayList<>();if (root != null) {result.add(root.val);}binaryTreePathsSub(root, result);return resultAll;}public void binaryTreePathsSub(TreeNode root, List<Integer> result) {if (root == null) {return;}if (root.left == null && root.right == null) {resultAll.add(new ArrayList<>(result));}if (root.left != null) {result.add(root.left.val);binaryTreePathsSub(root.left, result);result.remove(result.size() - 1);}if (root.right != null) {result.add(root.right.val);binaryTreePathsSub(root.right, result);result.remove(result.size() - 1);}}

深度优先搜索(DFS)

深度优先搜索是一种用于遍历或搜索树或图的算法。DFS探索尽可能深的节点,并在必要时通过回溯来探索其他分支。

DFS的关注点:单个节点

DFS在二叉树问题中关注的是单个节点。它会尝试沿着一条路径深入到不能再深入为止,然后回溯到最近的分叉点,尝试其他路径。

例子:二叉树的深度

一个简单的例子是计算二叉树的最大深度。DFS可以从根节点开始,尽可能深地遍历每个分支,直到到达叶子节点。通过记录遍历过程中的最大深度,我们可以得到整棵树的最大深度。

/*** 二叉树的最大深度* @param root* @return*/int maxDepth(TreeNode root) {traverse(root);return res;}public void traverse(TreeNode root) {if (root == null) {return;}deepth++;traverse(root.left);if (root.left == null && root.right == null) {res = Math.max(res, deepth);}traverse(root.right);deepth--;}

总结

虽然动态规划、回溯算法和DFS都可以用于解决二叉树问题,但它们各自关联。

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

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

相关文章

掌握常用Docker命令,轻松管理容器化应用

Docker是一个开源的应用容器引擎&#xff0c;它可以让开发者将应用程序及其依赖打包到一个轻量级、可移植的容器中&#xff0c;然后发布到任何流行的Linux机器或Windows机器上&#xff0c;也可以实现虚拟化。容器是完全使用沙箱机制&#xff0c;相互之间不会有任何接口。下面介…

Python基础(九、重要的全局变量)

文章目录 全局变量是什么&#xff1f;引用全局变量修改全局变量注意事项结语 全局变量是什么&#xff1f; 首先&#xff0c;全局变量是在函数外部定义的变量&#xff0c;它可以在程序的任何地方被访问。就好像一家人共用的盘子&#xff0c;随手可以拿来用&#xff0c;但也可能…

智能仓储管理系统设计与实现

智能仓储管理系统设计与实现 第一章 绪论 1.1 设计背景 物联网&#xff08;英文&#xff1a;Internet of Things&#xff0c;缩写&#xff1a;IoT&#xff09;是万物相连的互联网&#xff0c;即把所有物品通过信息传感设备与互联网连接起来&#xff0c;以实现智能化识别、定位、…

【Unity入门】NGUI和UGUI比较

目录 NGUI组件比较多&#xff0c;比较常用的有UGUI组件比较少&#xff0c;比较常用的有NGUI和UGUI比较 现在主流项目中基本上都是NGUI和UGUI&#xff0c;那么到底选哪个&#xff0c;我们先来做个比较 图集处理功能比较 NGUI需要使用工具手动拼接图片成图集。 UGUI开发期间可以直…

Java网络爬虫拼接姓氏,名字并写出到txt文件(实现随机取名)

目录 1.爬取百家姓1.爬取代码2.爬取效果 2.爬取名字1.筛选男生名字2.筛选女生名字 3.数据处理&#xff08;去除重复&#xff09;4.拼接数据5.将数据写出到文件中 1.爬取百家姓 目标网站&#xff0c;仅作为实验目的。 ①爬取姓氏网站&#xff1a; https://hanyu.baidu.com/shic…

小狐狸ChatGPT系统 H5前端底部菜单导航文字修改方法

小狐狸ChatGPT系统后端都前端都是编译过的&#xff0c;需要改动点什么非常难处理&#xff0c;开源版修改后也需要编译后才能使用&#xff0c;大部分会员也不会使用&#xff0c;像简单的修改下底部菜单文字、图标什么的可以对照处理。这里以小狐狸ChatGPT系统1.9.2版本H5端为例&…

JWT signature does not match locally computed signature

1. 问题背景 最近在协助团队小盆友调试一个验签问题&#xff0c;结果还“节外生枝”了&#xff0c;原来不是签名过程的问题&#xff0c;是token的问题。 当你看到“JWT signature does not match locally computed signature. JWT validity cannot be asserted and should not…

多维时序 | MATLAB实CNN-Mutilhead-Attention卷积神经网络融合多头注意力机制多变量时间序列预测

多维时序 | MATLAB实CNN-Mutilhead-Attention卷积神经网络融合多头注意力机制多变量时间序列预测 目录 多维时序 | MATLAB实CNN-Mutilhead-Attention卷积神经网络融合多头注意力机制多变量时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 多维时序 | …

异或运算^简述

异或运算&#xff1a;^ 两个变量之间异或运算时&#xff0c;其二进制位相同取0&#xff0c;不同取1. 示例&#xff1a;a10 (0b 0000 1010) b3 (0b 0000 0011) a^b9(0b 0000 1001) 据此可以推算异或运算"^"有以下特性&#xff1a; a^a0 (0b 0000 0000)…

python使用apscheduler定时任务,固定周几运行程序

在add_job中添加参数day_of_week即可&#xff1a; day_of_week "0"表示&#xff1a;只有周一运行day_of_week "0-4"表示&#xff1a;周一到周五运行day_of_week "0,1,2"表示&#xff1a;周一二三运行 示例程序 from datetime import datet…

IDEA基本设置

本博客适用于纯新手小白&#xff0c;或者刚下载IDEA想要优化开发添加配置的读者。 基础设置 滚轮调整字体大小 打开 IntelliJ IDEA。 转到菜单栏中的 “File” -> “Settings”&#xff08;Windows/Linux&#xff09;或 “IntelliJ IDEA” -> “Preferences”&#xff…

2024年 Kubernetes 四大趋势预测

Kubernetes 在生产环境中的复杂性已经成为常态&#xff0c;在2023年这个平台工程盛行的时代&#xff0c;容器管理的最大亮点可能在于其灵活性&#xff0c;然而在运维政策和治理等方面仍然存在诸多挑战。Kubernetes 最大的吸引力之一在于其可扩展性和跨环境的广泛用例。但是&…

CTF show 71

CTF show 71 在源码中可以看到程序把缓冲区内容全部替换成了问号 ​​ ob_get_contents函数把缓冲区内容读到以后赋值给了变量s&#xff0c;类型是字符串。 ob_end_clean()函数清空当前缓冲区并且关闭缓冲区 ​​ 所以展示的结果中全是问号。所以我们需要在读取到文件以后…

计算机网络基础知识分享

计算机网络基础知识分享 发送一个http请求&#xff0c;从客户端到服务器端&#xff0c;都经历了什么? **Ⅰ&#xff0c;浏览器生成消息 ** &#xff08;1&#xff09;浏览器输入网址 我们的探索之旅从在浏览器中输入网址开始&#xff0c;网址&#xff0c;准确来说应该叫 UR…

JVM内存结构Java内存模型Java对象模型

悟空老师思维导图&#xff1a;https://naotu.baidu.com/file/60a0bdcaca7c6b92fcc5f796fe6f6bc9https://naotu.baidu.com/file/60a0bdcaca7c6b92fcc5f796fe6f6bc9 1.JVM内存结构&&Java内存模型&&Java对象模型 1.1.JVM内存结构 1.2.Java对象模型 Java对象模型…

Isaac Sim urdf文件导入

本教程展示如何在 Omniverse Isaac Sim 中导入 urdf 一. 使用内置插件导入urdf 安装urdf 插件 方法是转到“window”->“Extensions” 搜索框中输入urdf, 并启用 通过转至Isaac Utils -> Workflows -> URDF Importer菜单来访问 urdf 扩展。 表格中的 1,2,3 对应着…

问题回复:什么是 Java 中的 Lambda 表达式?有什么应用场景?

Lambda 表达式是 Java 8 引入的一项重要特性&#xff0c;它允许在代码中以更简洁的方式表达匿名函数&#xff08;也称为闭包&#xff09;。Lambda 表达式的引入是为了提供一种更简单、更便捷的方式来写匿名内部类。 Lambda 表达式的语法如下&#xff1a; (parameters) -> …

C语言例题3

1.设x、y、z和k都是int型变量&#xff0c;则执行表达式&#xff1a;x&#xff08;y4&#xff0c;z16&#xff0c;k32&#xff09;后&#xff0c;x的值为&#xff08;32&#xff09;&#xff1b; x(y4,z16,k32),x的值为32 理解逗号运算符在c语言中的工作方式&#xff1a;逗号运算…

Visual Basic的故事

Visual Basic&#xff08;VB&#xff09;是一种由Microsoft开发的面向对象的事件驱动编程语言。VB的故事始于上世纪90年代初&#xff0c;它在Windows平台上的成功对于图形用户界面&#xff08;GUI&#xff09;应用程序的开发产生了深远的影响。以下是关于VB发展过程和相关开发者…

VR全景展示的功能有哪些?适合用于哪些领域?

现如今&#xff0c;VR全景展示技术已经逐渐融入了我们的日常生活中&#xff0c;可能大部分人都还没有意识到VR全景是如何应用的&#xff0c;但其实VR全景针对多个行业的垂直领域都有一定的落地使用。在互联网高速发展的今天&#xff0c;多媒体所包含的种类也越来越多&#xff0…