好的,BFS,又学废了!

简介: BFS —— 广度优先搜索,咱们在数据结构课一定会学的。一起的还有前、中、后序遍历、DFS(深度优先搜索), 它们都是二叉树遍历的算法!

image.png

BFS —— 广度优先搜索,咱们在数据结构课一定会学的。一起的还有前、中、后序遍历、DFS(深度优先搜索), 它们都是二叉树遍历的算法!


实话讲,除了在学校学的时候大概知道这个,后来就陆续忘了......再后来,刷题可能会又捡起来,然后又忘......唉,学了忘,忘了学......


可是,这不就是学习的过程么?So,just do it!

深化复习的最佳限度就是 45 分钟或 9 遍 —— 薛金星


一图胜千言:

image.png


如图所示,就是 BFS 的遍历过程,逐层遍历,直至结束;

下面,通过动图具体来看结点进队列和出队列的过程:

image.png

直观感受,这和滑动窗口也类似呀,只不过窗口大小随着层级变化而变化;

image.png


以 BFS 算法遍历 Dom 树为例,JavaScript 实现:

function breadthFirstSearch(node) {  
    var nodes = [];  
    if (node != null) {  
        var queue = [];  
        queue.unshift(node); // 将初始节点放入队中
        while (queue.length != 0) {
            var item = queue.shift(); // 提取队首元素
            nodes.push(item);
            var children = item.children; 
            for (var i = 0; i < children.length; i++) // 遍历全部子元素
                queue.push(children[i]);  // 推入队中
        }  
    }  
    return nodes;  
}
breadthFirstSearch(document.getElementsByTagName("body")[0])


递归实现:

function breadthFirstSearch(node,nodes) {
    if (!(node == null)) {
        nodes.push(node);
        breadthFirstSearch(node.nextElementSibling,nodes); // 优先遍历兄弟节点
        breadthFirstSearch(node.firstElementChild,nodes); // 再遍历子节点
    }
    return nodes;
}
breadthFirstSearch(document.getElementsByTagName("body")[0],[])


递归真好用,来道题吧~

题:给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。

百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”

image.png


示例 1:

输入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 8
输出: 6 
解释: 节点 2 和节点 8 的最近公共祖先是 6。


示例 2:

输入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 4
输出: 2
解释: 节点 2 和节点 4 的最近公共祖先是 2, 因为根据定义最近公共祖先节点可以为节点本身。


注:所有节点的值都是唯一的;p、q 为不同节点且均存在于给定的二叉搜索树中。

解题思路:

  1. 二叉搜索树特点是,若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
  2. 基于第 1 点,可得:若 p、q 都小于根节点,则在左子树上;若 p、q 都大于根节点,则都在右子树上;若一大一小,则最近公共祖先节点就是根节点;


JavaScript 递归实现:

const lowestCommonAncestor = (root, p, q) => {
    if (p.val < root.val && q.val < root.val) {
        return lowestCommonAncestor(root.left, p, q);
    }
    if (p.val > root.val && q.val > root.val) {
        return lowestCommonAncestor(root.right, p, q);
    }
    return root;
};


看完本篇,两个要点:

  1. BFS,是一种利用队列实现的搜索算法。(与之相对的 DFS 是用栈来处理)
  2. 在二叉树中遍历、搜素,用递归,很清晰;

我是掘金安东尼,公众号同名,输出暴露输入,技术洞见生活,下次再会~


相关文章
|
编译器 C++ 开发者
【Conan 入门教程 】使用Conan 2.X和Autotools高效构建C/C++项目
【Conan 入门教程 】使用Conan 2.X和Autotools高效构建C/C++项目
607 1
|
Java 程序员 Maven
【C/C++ CommonAPI入门篇】深入浅出:CommonAPI C++ D-Bus Tools 完全使用教程指南
【C/C++ CommonAPI入门篇】深入浅出:CommonAPI C++ D-Bus Tools 完全使用教程指南
495 0
|
算法
交互式建模PAI
交互式建模PAI
466 0
|
Kubernetes Linux Shell
CentOS7下快速搭建K8s集群实践
CentOS7下快速搭建K8s集群实践
803 1
CentOS7下快速搭建K8s集群实践
|
10月前
|
SQL Java 数据库连接
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,有效减少连接开销,提升访问效率
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,有效减少连接开销,提升访问效率。本文介绍了连接池的工作原理、优势及实现方法,并提供了HikariCP的示例代码。
178 3
|
编解码 数据可视化 数据挖掘
【办公自动化】用Python将PDF文件转存为图片
【办公自动化】用Python将PDF文件转存为图片
368 1
|
10月前
|
监控 算法 Java
深入理解Java虚拟机(JVM)的垃圾回收机制
【10月更文挑战第21天】 本文将带你深入了解Java虚拟机(JVM)的垃圾回收机制,包括它的工作原理、常见的垃圾收集算法以及如何优化JVM垃圾回收性能。通过本文,你将对JVM垃圾回收有一个全新的认识,并学会如何在实际开发中进行有效的调优。
293 0
|
编解码 机器人 测试技术
2024年6月计算机视觉论文推荐:扩散模型、视觉语言模型、视频生成等
6月还有一周就要结束了,我们今天来总结2024年6月上半月发表的最重要的论文,重点介绍了计算机视觉领域的最新研究和进展。
434 8
|
前端开发 JavaScript Linux
Linux 下 12 个最佳 Notepad++ 替代品
Linux 下 12 个最佳 Notepad++ 替代品
|
机器学习/深度学习 存储 算法
一文读懂K-Means原理与Python实现
在本文中,你将学习到K-means算法的数学原理,作者会以尼日利亚音乐数据集为案例。带你了解了如何通过可视化的方式发现数据中潜在的特征。最后对训练好的K-means模型进行评估。
503 0