Java图的遍历知识点(含面试大厂题和源码)

图的遍历是图论中的一个基本概念,主要指的是按照某种规则,系统地访问图中的每一个顶点,且每个顶点仅被访问一次。图遍历的主要目的是为了搜索图中的信息或检查图中是否存在特定的路径或圈。图的遍历算法主要有两种:深度优先搜索(DFS)和广度优先搜索(BFS)。

深度优先搜索(DFS)

深度优先搜索算法从图中的某个顶点开始,探索尽可能深的分支,直到找到目标顶点,或者遇到没有未探索的相邻顶点为止。然后回溯,探索下一个分支。

  • 算法步骤
    1. 从起始顶点开始,将其标记为已访问。
    2. 选择一个与当前顶点相连的未访问过的顶点,从该顶点再次执行DFS。
    3. 重复步骤2,直到没有未访问的顶点为止。
    4. 如果还有其他未访问的顶点,选择一个未访问的顶点,重复步骤1。

DFS常用于寻找所有可达的顶点、拓扑排序、检测环等。

广度优先搜索(BFS)

广度优先搜索算法从图的某个顶点开始,先访问距离起点最近的顶点,然后是次近的,依此类推,直到所有顶点都被访问过。

  • 算法步骤
    1. 从起始顶点开始,将其标记为已访问,并加入队列中。
    2. 从队列中取出一个顶点,并访问其所有未访问的邻接顶点,将它们标记为已访问,并加入队列。
    3. 重复步骤2,直到队列为空。

BFS常用于寻找最短路径、层次遍历、广播消息等。

实现注意点

  • 存储结构:图的遍历可以在图的两种主要存储结构上实现,即邻接矩阵和邻接表。
  • 避免重复访问:无论是DFS还是BFS,在访问顶点时都需要标记顶点,避免重复访问。
  • 选择起点:图的遍历可以从图中任意一个顶点开始,但不同的起点可能导致遍历的结果不同。

图的遍历是理解和实现更复杂图算法的基础,掌握DFS和BFS对于深入学习图论和解决实际问题非常重要。以下是三道常见的面试题目,涵盖了不同的编程概念和技术点,每个题目都附带了Java实现的源码。

题目1: 二叉树的右视图

题目描述:给定一个二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。

示例

输入: [1,2,3,null,5,null,4]
输出: [1, 3, 4]

解题思路:使用广度优先搜索(BFS)进行层序遍历,每层遍历到的最后一个节点就是从右侧看到的节点。

Java代码实现

import java.util.*;class TreeNode {int val;TreeNode left;TreeNode right;TreeNode(int x) { val = x; }
}public class Solution {public List<Integer> rightSideView(TreeNode root) {List<Integer> result = new ArrayList<>();if (root == null) return result;Queue<TreeNode> queue = new LinkedList<>();queue.offer(root);while (!queue.isEmpty()) {int levelSize = queue.size();for (int i = 0; i < levelSize; i++) {TreeNode currentNode = queue.poll();if (i == levelSize - 1) {result.add(currentNode.val);}if (currentNode.left != null) queue.offer(currentNode.left);if (currentNode.right != null) queue.offer(currentNode.right);}}return result;}
}

题目2: LRU缓存机制

题目描述:设计和实现一个 LRU (最近最少使用) 缓存机制。实现 LRUCache 类:

  • LRUCache(int capacity) 以正整数作为容量 capacity 初始化 LRU 缓存
  • int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1
  • void put(int key, int value) 如果关键字已经存在,则变更其数据值;如果关键字不存在,则插入该组 key-value。当缓存容量达到上限时,它应该在写入新数据之前删除最久未使用的数据值,从而为新的数据值留出空间。

解题思路:使用哈希表加双向链表的方式实现。哈希表用于快速定位节点位置,双向链表用于表示节点间的先后顺序,便于快速添加和删除节点。

Java代码实现

import java.util.*;class LRUCache {class DLinkedNode {int key;int value;DLinkedNode prev;DLinkedNode next;public DLinkedNode() {}public DLinkedNode(int _key, int _value) {key = _key; value = _value;}private Map<Integer, DLinkedNode> cache = new HashMap<>();private int size;private int capacity;private DLinkedNode head, tail;public LRUCache(int capacity) {this.size = 0;this.capacity = capacity;// 使用伪头部和伪尾部节点head = new DLinkedNode();tail = new DLinkedNode();head.next = tail;tail.prev = head;}public int get(int key) {DLinkedNode node = cache.get(key);if (node == null) return -1;// 如果 key 存在,先通过哈希表定位,再移动到头部moveToHead(node);return node.value;}public void put(int key, int value) {DLinkedNode node = cache.get(key);if (node == null) {// 如果 key 不存在,创建一个新的节点DLinkedNode newNode = new DLinkedNode(key, value);// 添加进哈希表cache.put(key, newNode);// 添加至双向链表的头部addToHead(newNode);++size;if (size > capacity) {// 如果超出容量,删除双向链表的尾部节点DLinkedNode tail = removeTail();// 删除哈希表中对应的项cache.remove(tail.key);--size;}} else {// 如果 key 存在,先通过哈希表定位,再修改 value,并移动到头部node.value = value;moveToHead(node);}}private void addToHead(DLinkedNode node) {node.prev = head;node.next = head.next;head.next.prev = node;head.next = node;}private void removeNode(DLinkedNode node) {node.prev.next = node.next;node.next.prev = node.prev;}private void moveToHead(DLinkedNode node) {removeNode(node);addToHead(node);}private DLinkedNode removeTail() {DLinkedNode res = tail.prev;removeNode(res);return res;}
}

题目3: 合并K个升序链表

题目描述:给你一个链表数组,每个链表都已经按升序排列。请你将所有链表合并到一个升序链表中,返回合并后的链表。

示例

输入:lists = [[1,4,5],[1,3,4],[2,6]]
输出:[1,1,2,3,4,4,5,6]
解释:链表数组如上所示,将它们合并到一个升序链表中得到。

解题思路:可以使用优先队列来优化合并过程。优先队列可以帮助我们每次从各个链表中选出当前最小的元素添加到结果链表中。

Java代码实现

class ListNode {int val;ListNode next;ListNode() {}ListNode(int val) { this.val = val; }ListNode(int val, ListNode next) { this.val = val; this.next = next; }
}public class Solution {public ListNode mergeKLists(ListNode[] lists) {if (lists == null || lists.length == 0) return null;PriorityQueue<ListNode> queue = new PriorityQueue<>(lists.length, (a, b) -> a.val - b.val);ListNode dummy = new ListNode(0);ListNode tail = dummy;for (ListNode node : lists) {if (node != null) queue.add(node);}while (!queue.isEmpty()) {tail.next = queue.poll();tail = tail.next;if (tail.next != null) queue.add(tail.next);}return dummy.next;}
}

这三个题目分别涉及到二叉树的遍历、设计数据结构以及使用优先队列合并链表,是面试中常见的题型,熟练掌握它们对面试有很大帮助。

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

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

相关文章

Linux简单基础配置

以下配置一般需要切换为root用户下进行。 1、修改主机名 node1主机终端执行: hostnamectl set-hostname node1 node2主机终端执行: hostnamectl set-hostname node2 node3主机终端执行: hostnamectl set-hostname node3 2、配置固定IP vim /etc/sysconfig/network-scripts…

UE5 LiveLink 自动连接数据源,以及打包后不能收到udp消息的解决办法

为什么要自动连接数据源&#xff0c;因为方便打包后接收数据&#xff0c;这里我是写在了Game Instance,也可以写在其他地方&#xff0c;自行替换成Beginplay和Endplay 关于编辑器模式下能收到udp消息&#xff0c;打包后不能收到消息的问题有两点需要排查&#xff0c;启动打包后…

Jmeter脚本优化——CSV数据驱动文件

使用 CSV 数据文件设置实现参数化注册 1&#xff09; 本地创建 csv 文件&#xff0c;并准备要使用的数据&#xff0c;这里要参数化的是注册的用户名和邮箱。所以在 csv 文件中输入多组用户名和邮箱。 2&#xff09; 通过测试计划或者线程组的右键添加->配置元件->CSV…

亚信安慧AntDB解析:数据库技术的新里程碑

AntDB简化了开发运维&#xff0c;更提高了数据库的易用性。AntDB是一种创新的数据库管理系统&#xff0c;其设计理念旨在让用户能够更便捷地进行数据库操作&#xff0c;减少繁琐的配置和管理工作&#xff0c;提升工作效率。 通过AntDB&#xff0c;用户可以快速部署和管理数据库…

AI大模型的看法

现在的AI大模型行情可谓如火如荼&#xff0c;吸引了众多科技巨头和投资者的目光。随着大数据和计算力的不断提升&#xff0c;AI大模型在语音识别、自然语言处理、图像识别等领域取得了显著进展&#xff0c;为各行各业带来了前所未有的机遇。 在技术栈方面&#xff0c;AI大模型主…

Py之scikit-learn-extra:scikit-learn-extra的简介、安装、案例应用之详细攻略

Py之scikit-learn-extra&#xff1a;scikit-learn-extra的简介、安装、案例应用之详细攻略 目录 scikit-learn-extra的简介 scikit-learn-extra的安装 scikit-learn-extra的案例应用 1、使用 scikit-learn-extra 中的 IsolationForest 模型进行异常检测 scikit-learn-extra…

探索网络深处:爬虫技术的奥秘

目录 引言1. 网络的庞大性与信息的丰富性2. 爬虫在收集和分析网络信息方面的重要作用 一、 什么是爬虫&#xff1f;二、爬虫的应用领域三、爬虫的工作流程四、爬虫技术所面临的挑战与解决方案五、爬虫技术设计的伦理与法律问题文末推荐 引言 网络是一个庞大而丰富的宇宙&#…

ChatGPT已成澳洲“懒学生”们最爱,各大学加强检查人工智能辅助作弊行为!

据报道&#xff0c;越来越多的学生开始使用人工智能来写作业&#xff0c;但各所大学也在加倍努力&#xff0c;想方设法将他们一网打尽。 ▲图片来源于网络 悉尼大学透露&#xff0c;2023年有330份作业是用人工智能完成的&#xff0c;而新南威尔士大学最近也表示&#xff0c;他…

【yolo算法水果新鲜程度检测】

Yolo&#xff08;You Only Look Once&#xff09;系列算法是一类流行的一阶段实时目标检测模型&#xff0c;在水果检测领域有着广泛的应用。因其高效性和实时性而受到青睐&#xff0c;可用于识别和定位图像中不同种类的水果以及水果的新鲜度。 YOLOv3 已被用于水果商品的检测分…

在Spring Boot 2.x中,可以通过添加Redis的依赖来整合Redis

在Spring Boot 2.x中&#xff0c;可以通过添加Redis的依赖来整合Redis。 首先&#xff0c;您需要在pom.xml文件中添加以下依赖&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis<…

Java基础-正则表达式

文章目录 1.基本介绍2.正则底层实现1.matcher.find()完成的任务2.matcher.group(0)分析1.源代码2.解释&#xff08;不分组&#xff09;3.解释&#xff08;分组&#xff09; 3.总结 3.正则表达式语法1.基本介绍2.元字符的转义符号1.基本介绍2.代码实例 3.字符匹配符1.基本介绍2.…

HTML_CSS学习:表格、表单、框架标签

一、表格_跨行与跨列 1.相关代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>表格_跨行与跨列</title> </head> <body><table border"1" cellspacing"0&qu…

学员分享丨学习华为认证,为什么建议报班学习

我一直对计算机科学有着浓厚的兴趣&#xff0c;但在我遇见誉天教育之前&#xff0c;我只是独自摸索&#xff0c;没有明确的方向和方法。然而&#xff0c;在誉天教育&#xff0c;我找到了一个真正为学生着想的地方。这里有一支专业且热情的教师队伍&#xff0c;他们不仅在课堂上…

毕业设计:日志记录编写(3/17起更新中)

目录 3/171.配置阿里云python加速镜像&#xff1a;2. 安装python3.9版本3. 爬虫技术选择4. 数据抓取和整理5. 难点和挑战 3/241.数据库建表信息2.后续进度安排3. 数据处理和分析 3/17 当前周期目标&#xff1a;构建基本的python环境&#xff1a;运行爬虫程序 1.配置阿里云pytho…

C enum(枚举)

枚举是 C 语言中的一种基本数据类型&#xff0c;用于定义一组具有离散值的常量&#xff0c;它可以让数据更简洁&#xff0c;更易读。 枚举类型通常用于为程序中的一组相关的常量取名字&#xff0c;以便于程序的可读性和维护性。 定义一个枚举类型&#xff0c;需要使用 enum 关…

【Postman】工具使用介绍

一、postman工具介绍 1.什么是postman postman是谷歌开发的一款网页调试和接口测试工具&#xff0c;能够发送任何请求类型的http请求&#xff0c;支持GET/POST/PUT/DELETE等方法。postman简单易用&#xff0c;可以直接填写URL&#xff0c;header&#xff0c;body就可以发送一…

训练自己的声音模型,效果超级逼真,最牛的开源声音克隆项目 GPT-SoVITS

GPT-SoVITS 是一个开源的声音克隆项目&#xff0c;可以训练自己的声音模型。 效果非常好&#xff0c;使用超级简单。 如果你有声音克隆的需求&#xff0c;必须要试试这个项目。 不说废话&#xff0c;直接看怎么训练自己的声音模型。 1. 安装 我的是Windows系统&#xff0c…

Linux中的常用基础操作

ls 列出当前目录下的子目录和文件 ls -a 列出当前目录下的所有内容&#xff08;包括以.开头的隐藏文件&#xff09; ls [目录名] 列出指定目录下的子目录和文件 ls -l 或 ll 以列表的形式列出当前目录下子目录和文件的详细信息 pwd 显示当前所在目录的路径 ctrll 清屏 cd…

go的限流

背景 服务请求下游&#xff0c;oom&#xff0c;排查下来发现是一个下游组件qps陡增导致 但是司内网络框架比较挫&#xff0c;竟然不负责框架内存问题&#xff08;有内存管理模块&#xff0c;但逻辑又是无限制使用内存&#xff09; 每个请求一个r、w buffer&#xff0c;请求无限…

c 语言 三元搜索 - 迭代与递归(Ternary Search)

计算机系统使用不同的方法来查找特定数据。有多种搜索算法&#xff0c;每种算法更适合特定情况。例如&#xff0c;二分搜索将信息分为两部分&#xff0c;而三元搜索则执行相同的操作&#xff0c;但分为三个相等的部分。值得注意的是&#xff0c;三元搜索仅对排序数据有效。在本…