搜索
- 定义:
- 搜索算法(searching algorithm)用于在数据结构(例如数组、链表、树或图)中搜索一个或一组满足特定条件的元素
分类:
- 暴力搜索
- 自适应搜索
暴力搜索:
- 思路:
遍历
数据结构的每个元素 - 遍历策略:
- 线性搜索:适用于数组和链表
广度、深度优先搜索
:适用于树和图
- 优缺点:
- 优点:简单且通用性好,无须对数据做预处理和借助额外的数据结构
- 缺点:时间复杂度为
2025年6月15日...大约 1 分钟
遍历
数据结构的每个元素广度、深度优先搜索
:适用于树和图有序性
,每轮缩小一半搜索范围
,直至找到目标元素或搜索区间为空为止。nums[m]
和 target
的大小关系,分为以下三种情况:
nums[m] < target
时,说明 target
在区间 [m+1,j] 中,因此执行 i=m+1 。nums[m] > target
时,说明 target
在区间 [i,m−1] 中,因此执行 j=m−1 。nums[m] = target
时,说明找到 target
,因此返回索引 m 。int
类型,因此 i+j 可能会超出 int
类型的取值范围。为了避免大数越界,我们通常采用公式 m=⌊i+(j−i)/2⌋ 来计算中点队列
来实现。队列遵循先进先出
的规则,而广度优先遍历则遵循逐层推进
的规则/* 层序遍历 */
func levelOrder(root *TreeNode) []any {
// 初始化队列,加入根节点
queue := list.New()
queue.PushBack(root)
// 初始化一个切片,用于保存遍历序列
nums := make([]any, 0)
for queue.Len() > 0 {
// 队列出队
node := queue.Remove(queue.Front()).(*TreeNode)
// 保存节点值
nums = append(nums, node.Val)
if node.Left != nil {
// 左子节点入队
queue.PushBack(node.Left)
}
if node.Right != nil {
// 右子节点入队
queue.PushBack(node.Right)
}
}
return nums
}