深度优先和广度优先
前端精髓
共 2458字,需浏览 5分钟
· 2022-04-14
路径总和
是否存在从当前节点 root 到叶子节点的路径,满足其路径和为 sum
let root = {
value: 5,
left: {
value: 4,
left: {
value: 11,
left: {
value: 7,
left: null,
right: null
},
right: {
value: 2,
left: null,
right: null
}
},
right: null
},
right: {
value: 8,
left: {
value: 13,
left: null,
right: null
},
right: {
value: 4,
left: null,
right: {
value: 1,
left: null,
right: null
}
}
}
}
假定从根节点到当前节点的值之和为 val,我们可以将这个大问题转化为一个小问题:是否存在从当前节点的子节点到叶子的路径,满足其路径和为 sum - val。
// 深度优先
function hasPathSum (root, sum) {
if (root == null) {
return false
}
if (root.left == null && root.right == null) {
return root.value === sum
}
return hasPathSum(root.left, sum - root.value) || hasPathSum(root.right, sum - root.value)
}
广度优先
// 广度优先
function hasPathSum (root, sum) {
if (root === null) {
return false
}
let node = [root]
let value = [root.value]
while (node.length) {
let now = node.shift()
let temp = value.shift()
if (temp === sum) {
return true
}
if (now.left && now.left !== null) {
node.push(now.left)
value.push(now.left.value + temp)
}
if (now.right && now.right !== null) {
node.push(now.right)
value.push(now.right.value + temp)
}
}
return false
}
我们再看一个面试题,计算二叉树的所有路径。
// 深度优先
function binaryTree (root) {
let paths = []
let construct_paths = (root, path) => {
if (root) {
path += root.value.toString()
if (root.left === null && root.right === null) {
paths.push(path)
} else {
// 当前节点不是叶子节点,继续递归
path += '->'
construct_paths(root.left, path)
construct_paths(root.right, path)
}
}
}
construct_paths(root, '')
return paths
}
// [ '5->4->11->7', '5->4->11->2', '5->8->13', '5->8->4->1' ]
广度优先
// 广度优先
function binaryTree (root) {
if (root === null) {
return false
}
let node = [root]
let value = [root.value]
let paths = []
while (node.length) {
let now = node.shift()
let temp = value.shift()
if (now.left === null && now.right === null) {
paths.push(temp)
}
if (now.left && now.left !== null) {
node.push(now.left)
value.push(temp + '->'+ now.left.value)
}
if (now.right && now.right !== null) {
node.push(now.right)
value.push(temp + '->'+ now.right.value)
}
}
return paths
}
这里在提一句,深度优先和广度优先的感念, “深度优先搜索就是树的先序遍历”,“广度优先搜索就是树的按层遍历”。
评论
特征提取:传统算法 vs 深度学习
点击上方“小白学视觉”,选择加"星标"或“置顶”重磅干货,第一时间送达编者荐语 特征提取是计算机视觉中的一个重要主题。不论是SLAM、SFM、三维重建等重要应用的底层都是建立在特征点跨图像可靠地提取和匹配之上。特征提取是计算机视觉领域经久不衰的研究热点,总的来说,快速、准确、鲁棒的特征点提
小白学视觉
0
目标检测正负样本区分策略和平衡策略总结
点击上方“小白学视觉”,选择加"星标"或“置顶”重磅干货,第一时间送达作者丨深度眸@知乎(已授权)来源丨https://www.zhihu.com/people/huanghaian编辑丨极市平台未经允许不得二次转载极市导读 本文抛弃网络具体结构,仅仅从正负样本区分和正负样本平衡策略进行分
小白学视觉
0
【深度学习】人人都能看懂的LSTM
熟悉深度学习的朋友知道,LSTM是一种RNN模型,可以方便地处理时间序列数据,在NLP等领域有广泛应用。在看了台大李宏毅教授的深度学习视频后,特别是介绍的第一部分RNN以及LSTM,整个人醍醐灌顶。本文就是对视频的记录加上了一些个人的思考。0. 从RNN说起循环神经网络(Recurrent Neur
机器学习初学者
0
科普:深度学习训练,不同预算GPU选购指南
以下文章来源于微信公众号:DeepHub IMBA作者:Mike Clayton本文仅用于学术分享,如有侵权,请联系后台作删文处理导读购买显卡第一个要考虑的问题是什么?当然是预算。本文提供了不同预算的显卡选购指南,希望能对各位读者有所帮助。在进行机器学习项目时,特别是在处理深度学习和神经网络时,最好
机器学习初学者
0
深度解读RoCE v2网络技术
在日新月异的网络技术领域中,远程直接内存访问(RDMA)技术已成为优化数据传输流程、提升整体网络效能的关键驱动力。其中,以太网融合RDMA技术——RoCE(RDMA over Converged Ethernet),其第二代版本RoCE v2凭借显著的性能提升与更强的灵活性脱颖而出。本文来自“深度解
架构师技术联盟
0
Open-Sora全面开源升级:支持16s视频生成和720p分辨率
机器之心发布 机器之心编辑部Open-Sora 在开源社区悄悄更新了,现在单镜头支持长达16秒的视频生成,分辨率最高可达720p,并且可以处理任何宽高比的文本到图像、文本到视频、图像到视频、视频到视频和无限长视频的生成需求。我们来试试效果。生成个横屏圣诞雪景,发b站再生成个竖屏,发抖音还能
机器学习算法与Python实战
0
聊一聊我最关注的9个CV、SLAM、自动驾驶和AI圈子!
随着计算机视觉(2D/3D)、SLAM、自动驾驶、AI技术的快速迭代更新,可落地的技术也成为人们争先学习的重点。这使得从业者对于最前沿技术的获取能力变得至关重要。微信公众号便是一个非常有效的前沿信息分享平台。这里给大家推荐9个最常打开的计算机视觉、自动驾驶、SLAM、机器学习和AI方向的优质公众号平
3D视觉工坊
0
文本嵌入、文本分类和语义搜索
在实践中使用大型语言模型(LLM)中,RAG 的一个关键部分是使用文本嵌入从知识库中自动检索相关信息。在这里,我将更深入地讨论文本嵌入,并分享两个简单(但功能强大)的应用:文本分类和语义搜索。ChatGPT 吸引了全世界对人工智能及其潜力的想象。ChatGPT 的聊天界面是这一影响的关键因素,它使人
大邓和他的Python
0