【BFS二叉树】113路径总和II

113路径总和 II

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

思路:

题目最终输出的是路径,因此用BFS遍历的时候,需要记录走到每个节点的路径;

又因为路径和是要等于某个目标值的,因此也需要记录目标和。

⇒ 走到每个节点时需要记录 该结点的路径路径和

⇒ BFS 里queue 记录 的节点 [ node , [ node.val],node.val]

function TreeNode(val, left, right) {this.val = val === undefined ? 0 : valthis.left = left === undefined ? null : leftthis.right = right === undefined ? null : right
}// 根据数组创建一颗树
const createTree = (arr) => {const len = arr.lengthif (len === 0) return nullconst root = new TreeNode(arr[0]) // 根节点const queue = [root] // 用于存储每一层的节点let i = 1 // 当前节点在数组中的索引while (i < len) {const node = queue.shift() // 取出当前层的第一个节点const leftVal = arr[i++] // 左子节点的值const rightVal = arr[i++] // 右子节点的值if (leftVal !== null) {const leftNode = new TreeNode(leftVal)node.left = leftNodequeue.push(leftNode) // 将左子节点添加到队列中}if (rightVal !== null) {const rightNode = new TreeNode(rightVal)node.right = rightNodequeue.push(rightNode) // 将右子节点添加到队列中}}return root
}let arr = [5, 4, 8, 11, null, 13, 4, 7, 2, null, null, 5, 1]
let root = createTree(arr)
// console.log(root) // 输出树的结构/*** @param {TreeNode} root* @param {number} targetSum* @return {number[][]}*/
var pathSum = function (root, targetSum) {// 找出所有,遍历的时候记录路径,路径和,路径和用于判断是否满足条件let res = []if (!root) return reslet queue = [[root,[root.val],root.val]]while (queue.length) {const [node,path,pathSum] = queue.shift()// 满足条件保存。if (node.left === null && node.right === null && pathSum === targetSum) {res.push(path)}// 将临近的节点加入queueif (node.left) {queue.push([node.left, path.concat([node.left.val]), pathSum + node.left.val])}if (node.right) {queue.push([node.right, path.concat([node.right.val]), pathSum + node.right.val])}}return res
}

注意:path.concat 返回的是数组,path.push返回的是数组的长度。

 console.log([5].push(3)) // 返回的是长度。console.log([5].concat(3)) // [5, 3]let list = [5]list.push(2)console.log(list) // 返回的是 [5,2]

二、二叉树标记将路径和中分的点

从根到叶子节点的通路上,有个节点可以把通路上的节点平分成两部分,将其标记,统计整棵树上的所有节点和减去标记节点的和

如图,绿色的即为标记的点,

在这里插入图片描述

节点3上边为 6+7=13,下边为11+2=13,因此将3标记

节点5上边为7,下边有4+3 = 7,因此标记

节点1上边为7+5+4 = 16,下边为16,标记

思路:

BFS遍历每个节点,如果某个节点是所在路径的中间点,那么该节点的前缀和是所在路径和-该节点的值后剩余数的 一半,因此对于每个节点来说,都需要记录前缀和、路径和以及该节点的值。

因为树上可能会出现值一样的不同节点,因此visitedMap 需要保存的key是节点,而不能是节点的值。

function TreeNode(val, left, right) {this.val = val === undefined ? 0 : valthis.left = left === undefined ? null : leftthis.right = right === undefined ? null : right
}// 根据数组创建一颗树
const createTree = (arr) => {const len = arr.lengthif (len === 0) return nullconst root = new TreeNode(arr[0]) // 根节点const queue = [root] // 用于存储每一层的节点let i = 1 // 当前节点在数组中的索引while (i < len) {const node = queue.shift() // 取出当前层的第一个节点const leftVal = arr[i++] // 左子节点的值const rightVal = arr[i++] // 右子节点的值if (leftVal !== null) {const leftNode = new TreeNode(leftVal)node.left = leftNodequeue.push(leftNode) // 将左子节点添加到队列中}if (rightVal !== null) {const rightNode = new TreeNode(rightVal)node.right = rightNodequeue.push(rightNode) // 将右子节点添加到队列中}}return root
}let arr = [7, 6, 5, 3, null, 4, null, 11, null, 1, 3, 2, null, 16, null]
let root = createTree(arr)const bisectTreePath = (root) => {const queue = [[root, [root], root.val, [root.val]]]// 因为可能出现相同值的不同结点,如果map值存放值,就可能会遗漏。因此map的key存放树节点。let markedMap = new Map()const res = []while (queue.length > 0) {const [node, path, pathSum, pre] = queue.shift()markedMap.set(node, false)// 遇到叶子结点将结果保存。if (node.left === null && node.right === null) {res.push([path, pathSum, pre])}if (node.left !== null) {queue.push([node.left,path.concat(node.left),pathSum + node.left.val,pre.concat(pre.at(-1) + node.left.val)])}if (node.right !== null) {queue.push([node.right,path.concat(node.right),pathSum + node.right.val,pre.concat(pre.at(-1) + node.right.val)])}}for (let i = 0; i < res.length; i++) {const [path, pathSum, pre] = res[i]// console.log(path[0].val,11)for (let j = 0; j < pre.length - 1; j++) {if (pre[j] * 2 + path[j + 1].val === pathSum &&!markedMap.get(path[j + 1])) {markedMap.set(path[j + 1], true)}}}// 遍历markedMaplet sum = 0for (let [key, value] of markedMap) {if (value === false) {sum += key.val}}return sum
}console.log(bisectTreePath(root))

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

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

相关文章

(done) 使用 vscode 快速把 .ipynb 文件 转为 .py 文件

如图&#xff0c;先点红圈 随后点 Export 后续操作凭直觉 可以使用 vim 的匹配功能把那些难看的符号给删掉&#xff0c;比如 :%s/# \%\%.*$//g

git区域与对象

大纲 工作区(workspace directory):本机的代码项目,是一种沙箱环境 暂存区(stage index):工作区在程序员写程序的过程中会发生无数次改动&#xff0c;git不可能记录每一次的改动&#xff0c;这些改动的过程在暂存区负责记录&#xff0c;暂存区会将最终的状态随着程序员的提交…

ChromeDriver 122 版本为例 国内下载地址及安装教程

ChromeDriver 国内下载地址 https://chromedriver.com/download 靠谱 千千万万别下载错了 先确认 Chrome 浏览器版本 以 win64 版本为例 那我们下载这一个啊&#xff0c;不要下载错了 下载地址贴在这哈 https://storage.googleapis.com/chrome-for-testing-public/122.0.…

vscode 之 vue项目如何使用ctrl+鼠标左键跳转对应文件

话不多说&#xff0c;直接步入正题 使用项目工程的jsconfig.json 直接在项目中使用jsconfig.json/tsconfig.json文件配置&#xff08;项目中没有相应的文件的添加文件&#xff0c;有文件的添加"paths": {"/*": ["./src/*"]}配置即可&#xff0…

javaweb day16 mysql

mysql 安装&#xff1a; 企业开发使用方法 安装虚拟机代替服务器 数据模型 创建数据库 写法 sql简介

如何用 Vue3 + Vite + SCSS 轻松实现换肤功能

前言 一个网站的换肤效果算是一个比较常见的功能&#xff0c;尤其是在后台管理系统中&#xff0c;我们几乎都能看到他的身影&#xff0c;这里给大家提供一个实现思路。 搭建项目 vitevue3搭建项目这里就不演示了&#xff0c;vite官网里面讲得很清楚。 注&#xff1a;这里使…

EdgeSAM: Prompt-In-the-Loop Distillation for On-Device Deployment of SAM

EdgeSAM: Prompt-In-the-Loop Distillation for On-Device Deployment of SAM EdgeSAM论文&#xff1a;https://arxiv.org/pdf/2312.06660.pdf EdgeSAM代码&#xff1a;https://github.com/chongzhou96/EdgeSAM 1 概述 作者在对各种蒸馏策略进行深入剖析后&#xff0c;证实了…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:TextClock)

TextClock组件通过文本将当前系统时间显示在设备上。支持不同时区的时间显示&#xff0c;最高精度到秒级。 说明&#xff1a; 该组件从API Version 8开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 无 接口 TextClock(options?…

Redis底层数据结构之List

文章目录 1. Redis 6的list源码分析1. Redis 7的list源码分析 1. Redis 6的list源码分析 首先我们查看一下redis 6关于list的相关配置&#xff1a; config get list*可以看见redis 6的quicklist底层使用的数据结构是ziplist list-compress-depth&#xff1a;表示一个quicklis…

CSS中position的属性有哪些,区别是什么

position有以下属性值&#xff1a; 属性值概述absolute生成绝对定位的元素&#xff0c;相对于static定位以外的一个父元素进行定位。元素的位置通过left、top、right、bottom属性进行规定。relative生成相对定位的元素&#xff0c;相对于其原来的位置进行定位。元素的位置通过…

使用Golong轻松实现JWT身份验证

使用Golong轻松实现JWT身份验证 JSON Web Tokens (JWT)是一种流行的安全方法&#xff0c;用于在两个方之间表示声明。在Web应用程序领域&#xff0c;它们通常用作从客户端向服务器传输身份信息&#xff08;声明&#xff09;的方式。本教程将引导您逐步实现Go应用程序中的JWT身份…

中国湿地沼泽分类分布数据集

数据下载链接&#xff1a;百度云下载链接 引言 随着经济社会的快速发展和城市化进程的加速推进&#xff0c;农业发生功能性转变&#xff0c;从单一生产功能向生产、生活、生态多功能服务首都经济社会发展转变。湿地与农田、草地、森林三大生态系统整合形成完整的现代农业生态服…