数据结构进阶面试题-2023面试题库
本文紧接上一篇基础问题,进行相对深入探索
进阶数据结构
24. 什么是二叉树数据结构?二叉树有哪些应用?
二叉树是一种数据结构,用于以允许有效检索和操作的方式组织数据。它是一种数据结构,它使用两个节点(称为叶子和节点)来表示数据。叶子表示数据,节点表示叶子之间的关系。每个节点有两个子节点,称为同级,每个子节点都有一个父节点。父节点是最接近树根的节点。从树中删除节点时,该节点会同时从其子节点和父节点中删除。
以下是二叉树数据结构的一些应用:
- 它广泛用于计算机网络中存储路由表信息。
- 决策树。
- 表达式评估。
- 数据库索引。
25. 什么是二叉搜索树数据结构?二叉搜索树有哪些应用?
二叉搜索树是一种按排序顺序存储项目的数据结构。在二叉搜索树中,每个节点存储一个键和一个值。键用于访问项,值用于确定项是否存在。键可以是任何类型的值,例如整数、浮点数、字符串,甚至是这些类型的组合。该值可以是任何类型的项,例如整数、浮点数、字符串,甚至是这些类型的组合。将节点添加到树中时,其键用于访问存储在该节点上的项。从树中删除节点时,其键用于访问存储在该节点上的项。
二叉搜索树是一种特殊类型的二叉树,其中包含特定的元素顺序。它具有三个基本品质:
- 节点左侧子树中的所有元素的值都应小于或等于父节点的值,并且
- 节点右侧子树中的所有元素的值都应大于或等于父节点的值。
- 左右子树也必须是二叉搜索树。

- 它用于索引和多级索引。
- 它用于实现各种搜索算法。
- 它有助于组织排序的数据流。
26. 什么是树遍历?
树遍历是访问树的所有节点的过程。由于根(头)是第一个节点,并且所有节点都通过边缘(或链接)连接,因此我们始终从该节点开始。我们用三种方式遍历一棵树。然后,请考虑以下树作为示例:
1. 中序遍历:
- 算法:
- 第 1 步。遍历左子树,即调用 Inorder(root.left)
- 第 2 步。访问根。
- 第 3 步。遍历右子树,即调用 Inorder(root.right)
- Java 中的中序遍历:
// Print inorder traversal of given tree.
void printInorderTraversal(Node root)
{
if (root == null)
return;
//first traverse to the left subtree
printInorderTraversal(root.left);
//then print the data of node
System.out.print(root.data + " ");
//then traverse to the right subtree
printInorderTraversal(root.right);
}
- 用途:在二叉搜索树 (BST) 中,顺序遍历按升序给出节点。
2. 前序遍历:
- 算法:
- 第 1 步。访问根。
- 第 2 步。遍历左子树,即调用Preorder(root.left)
- 第 3 步。遍历右子树,即调用Preorder(root.right)
- Java 中的前序遍历:
// Print preorder traversal of given tree.
void printPreorderTraversal(Node root)
{
if (root == null)
return;
//first print the data of node
System.out.print(root.data + " ");
//then traverse to the left subtree
printPreorderTraversal(root.left);
//then traverse to the right subtree
printPreorderTraversal(root.right);
}
- 使用:
- 前序遍历通常用于创建树的副本。
- 它还用于获取表达式树的前缀表达式。
3. 后序遍历:
- 算法:
- 第 1 步。遍历左子树,即调用 Postorder(root.left)
- 第 2 步。遍历右子树,即调用 Postorder(root.right)
- 第 3 步。访问根。
- Java 中的后序遍历:
// Print postorder traversal of given tree.
void printPostorderTraversal(Node root)
{
if (root == null)
return;
//first traverse to the left subtree
printPostorderTraversal(root.left);
//then traverse to the right subtree
printPostorderTraversal(root.right);
//then print the data of node
System.out.print(root.data + " ");
}
- 使用:
- 后序遍历通常用于删除树。
- 获取表达式树的后缀表达式也很有用。
27. 什么是deque数据结构及其类型?deques有哪些应用?
deque可以被认为是一个项目数组,但有一个重要的区别:deques不是将项目从末端推开以腾出空间,而是设计为允许在任一端插入项目。此属性使 deques 非常适合执行任务,例如跟踪库存、计划任务或处理大量数据。
deque可以被认为是一个类似数组结构,但有一个重要的区别:deque的设计允许在两端插入项,而不是将项推到末尾或弹出以腾出空间。这个属性使得deques非常适合执行诸如跟踪库存、调度任务或处理大量数据等任务。
-
deque有两种类型:
- 输入受限deque:插入操作仅在输入受限队列的一端执行,而删除操作在输入受限队列的两端执行。

- 输出受限deque: 删除操作仅在输出受限队列的一端执行,而插入操作在输出受限队列的两端执行。

以下是一些用于deque数据结构的实时应用程序:
- 它可以用作堆栈和队列,因为它支持两种数据结构的所有操作。
- Web 浏览器的历史记录可以存储在一个 deque 中。
- 操作系统作业调度算法。
28. 对Deque数据结构执行哪些关键操作?
以下是可用的关键操作:
- insertFront():这会在 Deque 的前面添加一个元素。
- insertLast():这会在 Deque 的后面添加一个元素。
- deleteFront():这会从 Deque 的前面删除一个元素。
- deleteLast():这会从 Deque 的前面删除一个元素。
- getFront():这从Deque的前面获取一个元素。
- getRear():这从 Deque 的后部获取一个元素。
- isEmpty():这将检查 Deque 是否为空。
- isFull():检查 Deque 是否已满。
29. 什么是优先级队列?优先队列有哪些应用?
优先级队列是一种抽象数据类型,类似于队列,因为每个元素都被分配了一个优先级值。优先级队列中元素的供应顺序由它们的优先级(即删除它们的顺序)决定。如果元素具有相同的优先级,则按它们在队列中出现的顺序提供它们。
以下是一些用于优先级队列的实时应用程序:
- 用于图算法,如Dijkstra,Prim的最小生成树等。
- 用于数据压缩的霍夫曼代码
- 查找第 k 个最大/最小元素
30. 比较优先级队列的不同实现
下表包含对优先级队列的不同实现的渐近分析:
操作 | 查找 | 插入 | 删除 |
---|---|---|---|
链表 | O(1) | O(n) | O(1) |
二进制堆 | O(1) | O(log n) | O(log n) |
二叉搜索树 | O(1) | O(log n) | O(log n) |
31. 什么是图数据结构及其表示?图形有哪些应用?
图是一种由节点和边组成的非线性数据结构。节点也称为顶点,边是连接图形中任意两个节点的直线或弧。

以下是两种最常见的图形表示形式:
1. 邻接矩阵:邻接矩阵是一个二维数组,维度为 V x V,其中 V 是图中的顶点数。表示更易于实现和遵守。移除边缘需要 O(1) 时间。诸如从顶点“u”到顶点“v”是否存在边之类的查询是有效的,可以在 O(1) 中完成。
这种表示的缺点之一是,即使图形是稀疏的(边缘较少),它也占用相同的空间量。添加顶点需要 O(V^2)。计算顶点的所有邻居也需要 O(V) 时间,效率不高。
2.邻接列表:在此方法中,每个节点都包含直接连接到该顶点的节点列表。列表末尾的每个节点都使用 null 值连接,以指示它是列表中的最后一个节点。这样可以节省空间 O(|V|+|E|)。在最坏的情况下,图形可以有 C(V, 2) 边,占用 O(V^2) 空间。添加顶点更简单。计算顶点的所有相邻点所需的时间最少。
这种表示的缺点之一是,诸如“从顶点你到顶点v有边吗?”这样的查询效率低下,在最坏的情况下取O(V)。
32. 广度优先搜索(BFS)和深度优先搜索(DFS)有什么区别?

广度优先搜索 (BFS) | 深度优先搜索 (DFS) |
---|---|
它代表“广度优先搜索” | 它代表“深度优先搜索” |
BFS(广度优先搜索)使用队列数据结构查找最短路径。 | DFS(深度优先搜索)使用堆栈数据结构查找最短路径。 |
在进入 BFS 中的下一个级别之前,我们将遍历同一级别上的所有节点。 | DFS 从根节点开始,并尽可能通过节点进行,直到我们到达没有未访问的附近节点的节点。 |
与DFS相比,BFS更慢。 | 与BFS相比,DFS更快。 |
当目标靠近源时,BFS 的性能更好。 | 当目标远离源时,DFS 的性能更好。 |
BFS 需要更多的内存。 | DFS 需要较少的内存。 |
已遍历多次的节点将从队列中删除。 | 当没有更多要访问的节点时,访问的节点将添加到堆栈中,然后删除。 |
回溯不是BFS中的选项。 | DFS 算法是一种采用回溯概念的递归算法。 |
它基于先进先出原则(先进先出)。 | 它基于后进先出原则(后进先出)。 |
33. 什么是AVL树数据结构、操作和旋转?AVL树有哪些应用?
AVL树是高度平衡二叉搜索树,以其发明者Adelson,Velski和Landis命名。AVL 树比较左右子树的高度,并确保差异小于 1。这种区别称为平衡因子。
平衡因子 = 高度(左子树) − 高度(右子树)

我们可以在 AVL 树上执行以下两个操作:
- 插入:在 AVL 树中插入的方式与在二叉搜索树中插入的方式相同。但是,它可能会导致 AVL 树属性中出现冲突,从而需要平衡树。旋转可用于平衡树。
- 删除:也可以以与二叉搜索树相同的方式执行删除。由于删除会破坏树的平衡,因此使用各种类型的旋转来重新平衡它。
AVL 树可以通过执行下面列出的四个旋转来平衡自身:
- 左旋转:当一个节点插入到右子树的右子树中并且树变得不平衡时,我们执行一个左旋转。
- 右旋:如果在左侧子树的左侧子树中插入节点,则 AVL 树可能会变得不平衡。然后,树需要向右旋转。
- 左右旋转:首先在子树上执行 RR 旋转,然后在整个树上执行 LL 旋转。
- 左右旋转:首先在子树上执行 LL 轮换,然后在整个树上执行 RR 轮换。
以下是AVL树数据结构的一些实时应用程序:
- AVL 树通常用于内存中集和字典。
- AVL 树还广泛用于插入和删除较少但需要频繁数据查找的数据库应用程序。
- 除了数据库应用程序外,它还用于需要改进搜索的应用程序。
34. 什么是B树数据结构?B树有哪些应用?
B 树是一种通常用于光盘访问的 m 路树。阶数为 m 的 B 树只能有 m-1 键和 m 个子项。使用 B 树的主要原因之一是它能够在单个节点中存储大量键以及较大的键值,同时保持树的高度相对较小。
下图显示了 4 阶的 B 树:

以下是 B 树数据结构的关键属性:
- 所有的叶子都处于相同的高度。
- 术语最小度数“t”描述了B树。t 的值由光盘块的大小决定。
- 除根节点外,每个节点必须至少具有 t-1 个键。根必须至少包含一个密钥。
- 所有节点(包括根节点)的密钥不能超过 2*t - 1。
- 节点的子节点数等于其键数加 1。
- 节点的键按升序排序。两个键 k1 和 k2 的子项包含 k1 和 k2 之间的所有键。
- 与二叉搜索树相比,B树从根部生长和收缩。
以下是B树数据结构的实时应用:
- 它用于访问存储在大型数据库中的光盘上的数据。
- 使用 B 树,您可以在更短的时间内搜索数据集中的数据。
- 索引功能允许多级索引。
- 大多数服务器也使用 B 树方法。
35. 定义Segment 树数据结构及其应用。
Segment树是用于存储间隔或段的二叉树。Segment树由表示间隔的节点组成。当对数组有多个范围查询并对数组元素进行更改时,将使用Segment树。
数组 A[7] 的Segment树将如下所示:

以下是对Segment树数据结构执行的关键操作:
- 构建树:在此步骤中,我们创建结构并初始化Segment树变量。
- 更新树:在此步骤中,我们通过在一个点或间隔内更新数组值来更改树。
- 查询树:此操作可用于对数组运行范围查询。
以下是Segment树的实时应用程序:
- 用于有效地列出平面中矩形列表中的所有相交矩形对。
- Segment树在模式识别和图像处理中已变得很流行。
- 查找范围总和/乘积、范围最大值/最小值、前缀总和/乘积等
- 计算几何
- 地理信息系统
- 静态和动态 RMQ(范围最小查询)
- 以任意方式存储段
36. 定义 Trie 数据结构及其应用
“Trie”一词是“检索”的缩写。Trie 是一种数据结构,它将一组字符串存储为排序树。每个节点的指针数与字母字符数相同。它可以使用其前缀在字典中查找单词。假设所有字符串都是由英文字母中的字母“a”到“z”组成的,则每个trie节点最多可以有26个点。
Trie 也称为数字树或前缀树。节点连接到的密钥由其在 Trie 中的位置决定。Trie 允许我们在 O(L) 时间内插入和查找字符串,其中 L 是单个单词的长度。这显然比BST更快。由于它的实现方式,这也比哈希更快。无需计算哈希函数。无需处理冲突(就像我们在开放寻址和单独链接中所做的那样)
Trie 的另一个好处是我们可以轻松地按字母顺序打印所有单词,这在散列中并不容易。Trie 还可以有效地执行前缀搜索(或自动完成)。

tries的主要缺点是它们需要大量的内存来存储字符串。每个节点的节点指针数量过多
以下是Trie数据结构的一些实时应用程序:
- 自动完成和搜索搜索引擎
- 基因组分析
- 数据分析
- 浏览器历史记录
- 拼写检查器
37. 定义红黑树及其应用
红黑树是一种自平衡二叉搜索树。鲁道夫·拜耳(Rudolf Bayer)于1972年发明了它,并将其称为“对称二元B树”。
红黑树是二叉树,其中每个节点都有一个颜色属性,红色或黑色。通过比较从根到叶的任何简单路径上的节点颜色,红黑树确保没有路径的长度是任何其他路径的两倍以上,从而确保树总体上是平衡的。
红黑树与二叉树相似,因为它们都以二进制互补的二进制格式存储数据。然而,与二叉树相比,红黑树有一个重要的优势:它们的访问速度更快。由于红黑树的访问速度非常快,因此它们通常用于存储大量数据。
红黑树可用于存储可表示为一组值的任何类型的数据

- 每个节点都是红色或黑色的。
- 树根总是黑色的。
- 没有两个相邻的红色节点。
- 从节点到其后代的任何 NULL 节点的每个路径上都有相同数量的黑色节点。
- 所有叶节点均为黑色。
以下是红黑树数据结构的一些实时应用程序:
- C++或Java中的大多数自平衡BST库函数都使用红黑树。
- 它用于实现 Linux CPU 调度。
- 它还用于降低机器学习中 K 均值聚类算法中的时间复杂度。
- MySQL还使用红黑树作为表索引,以减少搜索和插入时间。
38. 实现LRU缓存使用哪些数据结构?
LRU 缓存或最近最少使用的缓存允许通过按使用顺序组织项目来快速识别长时间未使用的元素。为了实现这一点,使用了两种数据结构:
- 队列 – 这是使用双向链表实现的。队列的最大大小由缓存大小决定,即由可用帧的总数决定。最近最少使用的页面将靠近队列的前端,而最近使用的页面将位于队列的后端。
- 哈希映射 – 哈希映射将页码存储为键,并将相应队列节点的地址存储为值。

39. 什么是堆数据结构?
堆是一种特殊的基于树的非线性数据结构,其中树是一个完整的二叉树。如果除最后一关之外的所有关卡都被完全填满,并且最后一关尽可能保留所有元素,则称二叉树是完整的。堆有两种类型:
- 最大堆:
- 在最大堆中,根节点上存在的数据元素必须是树中存在的所有数据元素中最大的。
- 对于该二叉树的所有子树,此属性应递归为真。
- 最小堆:
- 在最小堆中,根节点上的数据元素必须是树中存在的所有数据元素中的最小(或最小值)。
- 对于该二叉树的所有子树,此属性应递归为真
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!