【每日算法】搜索与回溯算法(简单)

简介: 搜索与回溯算法(简单)

16fb98eea012ef0cb446588ddc50662.png

题目

剑指 Offer 32 - I. 从上到下打印二叉树

从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。

示例:

给定二叉树: [3,9,20,null,null,15,7]

3
   / \
  9  20
    /  \
   15   7
复制代码

返回:

[3,9,20,15,7]
复制代码

分析一

先按自己的思路来一版

首先定义一个数组作为最终的返回值

二叉树题目常规思路使用递归

那么我们的思路就是从上到下遍历每一层,

退出条件就是当前层的节点数为0时

递归内部的行为就是从左往右将当前节点值添加到结果数组中,然后在从左往右维护一个数组,作为下一次递归的输入值

递归结束,输出结果

实现

function levelOrder(root: TreeNode | null): number[] {
    if (!root) return []
    let res: number[] = []
    function handle(list: TreeNode[]) {
        if (!list.length) return
        let tmp = []
        for (let i = 0; i < list.length; i ++) {
            const node = list[i]
            res.push(node.val)
            if (node.left) {
                tmp.push(node.left)
            }
            if (node.right) {
                tmp.push(node.right)
            }
        }
        handle(tmp)
    }
    handle([root])
    return res
};
复制代码

分析二

看了解析有一种更合理的解决方式,使用队列的形式来解决,利用队列先进先出的特性,实现从上往下层层遍历

实现

function levelOrder(root: TreeNode | null): number[] {
    if (!root) return []
    let res: number[] = []
    let queue: TreeNode[] = []
    queue.push(root)
    while(queue.length) {
        const node = queue.shift()
        res.push(node.val)
        if (node.left) {
            queue.push(node.left)
        }
        if (node.right) {
            queue.push(node.right)
        }
    }
    return res
};
复制代码

题目

剑指 Offer 32 - II. 从上到下打印二叉树 II

从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。

例如: 给定二叉树: [3,9,20,null,null,15,7]

3
   / \
  9  20
    /  \
   15   7
复制代码

返回其层次遍历结果:

[
  [3],
  [9,20],
  [15,7]
]
复制代码

分析

这道题和上一道类似,只是返回的数据结果不同,那么我们使用同样的思路在做一遍,只要最终结果处理一下

由于同层的需要作为一个数组返回,我们需要在循环的时候维护一个中间变量来存储同层的结果,在进行循环

实现

function levelOrder(root: TreeNode | null): number[][] {
    if (!root) return []
    let res: number[][] = []
    let queue: TreeNode[] = []
    queue.push(root)
    while(queue.length) {
        let tmp:number[] = []
        let len = queue.length
        let index = 0
        while(index < len) {
            const node = queue.shift()
            tmp.push(node.val)
            if (node.left) {
                queue.push(node.left)
            }
            if (node.right) {
                queue.push(node.right)
            }
            index ++
        }
        res.push(tmp)
    }
    return res
};
相关文章
|
2月前
|
机器学习/深度学习 算法 C++
【DFS/回溯算法】2016年蓝桥杯真题之路径之谜详解
题目要求根据城堡北墙和西墙箭靶上的箭数,推断骑士从西北角到东南角的唯一路径。每步移动时向正北和正西各射一箭,同一格不重复经过。通过DFS回溯模拟“拔箭”过程,验证路径合法性。已知箭数约束路径唯一,最终按编号输出行走顺序。
|
3月前
|
机器学习/深度学习 算法 安全
【无人机三维路径规划】基于非支配排序的鲸鱼优化算法NSWOA与多目标螳螂搜索算法MOMSA求解无人机三维路径规划研究(Matlab代码实现)
【无人机三维路径规划】基于非支配排序的鲸鱼优化算法NSWOA与多目标螳螂搜索算法MOMSA求解无人机三维路径规划研究(Matlab代码实现)
223 5
|
3月前
|
机器学习/深度学习 算法 安全
【无人机三维路径规划】多目标螳螂搜索算法MOMSA与非支配排序的鲸鱼优化算法NSWOA求解无人机三维路径规划研究(Matlab代码实现)
【无人机三维路径规划】多目标螳螂搜索算法MOMSA与非支配排序的鲸鱼优化算法NSWOA求解无人机三维路径规划研究(Matlab代码实现)
179 0
|
4月前
|
算法
回溯算法的基本思想
本节介绍回溯算法,通过图1中从A到K的路径查找示例,说明其与穷举法的异同。回溯算法通过“回退”机制高效试探各种路径,适用于决策、优化和枚举问题。
129 0
|
2月前
|
算法 数据可视化 测试技术
HNSW算法实战:用分层图索引替换k-NN暴力搜索
HNSW是一种高效向量检索算法,通过分层图结构实现近似最近邻的对数时间搜索,显著降低查询延迟。相比暴力搜索,它在保持高召回率的同时,将性能提升数十倍,广泛应用于大规模RAG系统。
196 10
HNSW算法实战:用分层图索引替换k-NN暴力搜索
|
4月前
|
机器学习/深度学习 算法 文件存储
神经架构搜索NAS详解:三种核心算法原理与Python实战代码
神经架构搜索(NAS)正被广泛应用于大模型及语言/视觉模型设计,如LangVision-LoRA-NAS、Jet-Nemotron等。本文回顾NAS核心技术,解析其自动化设计原理,探讨强化学习、进化算法与梯度方法的应用与差异,揭示NAS在大模型时代的潜力与挑战。
1061 6
神经架构搜索NAS详解:三种核心算法原理与Python实战代码
|
8月前
|
人工智能 自然语言处理 算法
阿里云 AI 搜索开放平台:从算法到业务——AI 搜索驱动企业智能化升级
本文介绍了阿里云 AI 搜索开放平台的技术的特点及其在各行业的应用。
873 3
|
3月前
|
存储 算法 数据可视化
基于禁忌搜索算法的TSP问题最优路径搜索matlab仿真
本程序基于禁忌搜索算法解决旅行商问题(TSP),旨在寻找访问多个城市的最短路径。使用 MATLAB 2022A 编写,包含城市坐标生成、路径优化及结果可视化功能。通过禁忌列表、禁忌长度与藐视准则等机制,提升搜索效率与解的质量,适用于物流配送、路径规划等场景。
|
4月前
|
机器学习/深度学习 并行计算 算法
MATLAB实现利用禁忌搜索算法解决基站选址问题
MATLAB实现利用禁忌搜索算法解决基站选址问题
166 0
|
5月前
|
存储 搜索推荐 算法
加密算法、排序算法、字符串处理及搜索算法详解
本文涵盖四大类核心技术知识。加密算法部分介绍了对称加密(如 AES)、非对称加密(如 RSA)、哈希摘要(如 SHA-2)、签名算法的特点及密码存储方案(加盐、BCrypt 等)。 排序算法部分分类讲解了比较排序(冒泡、选择、插入、归并、快排、堆排序)和非比较排序(计数、桶、基数排序)的时间复杂度、适用场景及实现思路,强调混合排序的工业应用。 字符串处理部分包括字符串反转的双指针法,及项目中用正则进行表单校验、网页爬取、日志处理的实例。 搜索算法部分详解了二分查找的实现(双指针与中间索引计算)和回溯算法的概念(递归 + 剪枝),以 N 皇后问题为例说明回溯应用。内容全面覆盖算法原理与实践
199 0