0126 搜索与回溯算法 Day15

news/2024/11/28 7:29:06/

剑指 Offer 34. 二叉树中和为某一值的路径

给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。

叶子节点 是指没有子节点的节点。

示例 1:

输入:root = [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum = 22
输出:[[5,4,11,2],[5,8,4,5]]
示例 2:

输入:root = [1,2,3], targetSum = 5
输出:[]
示例 3:

/*** 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 List<List<Integer>> pathSum(TreeNode root, int target) {}
}

使用回溯法解决,其包含 先序遍历 + 路径记录 两部分

先序遍历: 按照 “根、左、右” 的顺序,遍历树的所有节点。
路径记录: 在先序遍历中,记录从根节点到当前节点的路径。当路径满足 ① 根节点到叶节点形成的路径 且 ② 各节点值的和等于目标值 sum 时,将此路径加入结果列表。

算法流程:
pathSum(root, sum) 函数:

初始化: 结果列表 res ,路径列表 path 。
返回值: 返回 res 即可。


recur(root, tar) 函数:

递推参数: 当前节点 root ,当前目标值 tar 。
终止条件: 若节点 root 为空,则直接返回。
递推工作:

1.路径更新: 将当前节点值 root.val 加入路径 path 。
2.目标值更新: tar = tar - root.val(即目标值 tar 从 sum 减至 0 )。
3.路径记录: 当 ① root 为叶节点 且 ② 路径和等于目标值 ,则将此路径 path 加入 res 。
4.先序遍历: 递归左 / 右子节点。
5.路径恢复: 向上回溯前,需要将当前节点从路径 path 中删除,即执行 path.pop() 。

 

 

 

 

 

 

 

 

 

 

 

代码如下

class Solution {LinkedList<List<Integer>> res = new LinkedList<>();LinkedList<Integer> path = new LinkedList<>();public List<List<Integer>> pathSum(TreeNode root, int sum) {recur(root, sum);return res;}void recur(TreeNode root, int tar) {if(root == null) return;path.add(root.val);tar -= root.val;if(tar == 0 && root.left == null && root.right == null)res.add(new LinkedList(path));recur(root.left, tar);recur(root.right, tar);path.removeLast();}
}

剑指 Offer 54. 二叉搜索树的第 k 大节点

给定一棵二叉搜索树,请找出其中第 k 大的节点的值。

示例 1:

输入: root = [3,1,4,null,2], k = 1
   3
  / \
 1   4
  \
   2
输出: 4


示例 2:

输入: root = [5,3,6,2,4,null,null,1], k = 3
       5
      / \
     3   6
    / \
   2   4
  /
 1
输出: 4

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode(int x) { val = x; }* }*/
class Solution {public int kthLargest(TreeNode root, int k) {}
}

解题思路

基于性质:二叉搜索树的中序遍历为递增序列。根据此性质,易得二叉搜索树的 中序遍历倒序 为 递减序列 。
因此,求 “二叉搜索树第 k 大的节点” 可转化为求 “此树的中序遍历倒序的第 k 个节点”。

// 打印中序遍历
void dfs(TreeNode root) {if(root == null) return;dfs(root.left); // 左System.out.println(root.val); // 根dfs(root.right); // 右
}
// 打印中序遍历倒序
void dfs(TreeNode root) {if(root == null) return;dfs(root.right); // 右System.out.println(root.val); // 根dfs(root.left); // 左
}

递归解析:
终止条件: 当节点 root 为空(越过叶节点),则直接返回;
递归右子树: 即 dfs(root.right) ;
递推工作:
1.提前返回: 若 k = 0 ,代表已找到目标节点,无需继续遍历,因此直接返回;
2.统计序号: 执行 k = k - 1 (即从 k 减至 0 );
3.记录结果: 若 k=0 ,代表当前节点为第 k 大的节点,因此记录 res = root.val ;
递归左子树: 即 dfs(root.left) ;

 

 

 

 

 

 

代码如下

class Solution {int res, k;public int kthLargest(TreeNode root, int k) {this.k = k;dfs(root);return res;}void dfs(TreeNode root) {if(root == null) return;dfs(root.right);if(k == 0) return;if(--k == 0) res = root.val;dfs(root.left);}
}

 


http://www.ppmy.cn/news/4086.html

相关文章

百度apollo源码学习(一) DEFINE_TYPE_TRAIT的理解

文章目录前言源码解读SFINAE机制举例参考前言 最近学习百度apollo源码&#xff0c;发现很多看不懂的代码&#xff0c;因才疏学浅&#xff0c;只能通过上网搜索&#xff0c;逐步理解&#xff0c;然后将理解完成的内容再次进行记录&#xff0c;其中参考了很多其他博主的博客。 我…

强调句句型

一、强调句句型&#xff1a; 1、用It is&#xff0f;was...that&#xff0f;who...句型表示强调。 &#xff08;1&#xff09;陈述句的强调句型&#xff1a;It is/was被强调部分&#xff08;通常是主语、宾语或状语&#xff09;that/who&#xff08;当强调主语且主语指人&#…

Pycharm SQL 警告:SQL dialect is not configured.

Pycharm SQL 警告&#xff1a;SQL dialect is not configured. 文章目录Pycharm SQL 警告&#xff1a;SQL dialect is not configured.Unable to resolve symbol XXX在我们编写python代码的时候&#xff0c;不免会在代码里面写入自己写的sql语句&#xff0c;因为很少有orm框架能…

大数据毕业设计人体跌倒检测系统

文章目录前言1 实现方法传统机器视觉算法基于机器学习的跌倒检测SVM简介SVM跌倒检测原理算法流程算法效果实现代码深度学习跌倒检测最终效果网络原理最后前言 背景和意义 在美国&#xff0c;每年在65岁以上老人中&#xff0c;平均每3人中就有1人发生意外跌倒&#xff0c;每年…

第八部分 make 的运行

一般来说&#xff0c;最简单的就是直接在命令行下输入 make 命令&#xff0c;make 命令会找当前目录的 Makefile 来执行&#xff0c;一切都是自动化的。但有时你只想让 make 重新编译某些文件而不是整个工程&#xff0c;或你有几套编译规则&#xff0c;你想在不同的时候使用不同…

Qt6 qtmqtt编译及演示示例(附带动态库)

前言 随着物联网的不断发展&#xff0c;如今很多项目都需要接入&#xff0c;而两年前也是因为项目需要&#xff0c;了解了一些关于mqtt的用法&#xff0c;并将其过程记录成几篇博客&#xff0c;近一年多时间陆陆续续有好多人私信咨询关于mqtt相关的问题&#xff0c;其中又有很…

牛客java刷题知识点总结(六)

内存引用地址 内存引用地址&#xff0c;是指栈中存放的地址&#xff0c;来指向堆中的某个位置。 int 是基本类型&#xff0c;数据直接存放在栈中&#xff0c;不存在内存引用地址的说法 A对 指向常量池里的"hello"。 B对 题中没说声明的a是局部变量。 C错 int a 1;并…

QT 学习笔记(九)

文章目录一、事件的接收和忽略1. 准备工作2. 接收和忽略二、event() 函数1. 简介2. 实例演示3. 总结三、事件过滤器四、总结&#xff08;细看&#xff09;1. 知识点汇总2. QT 的事件处理五、事件、事件的接收和忽略、event() 函数和事件过滤器代码1. 主窗口头文件 mywidget.h2.…