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

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

16fb98eea012ef0cb446588ddc50662.png

题目

剑指 Offer 27. 二叉树的镜像

请完成一个函数,输入一个二叉树,该函数输出它的镜像。

示例:

输入:root = [4,2,7,1,3,6,9]
输出:[4,7,2,9,6,3,1]
复制代码

输入

4
   /   \
  2     7
 / \   / \
1   3 6   9
复制代码

输出

4
   /   \
  7     2
 / \   / \
9   6 3   1
复制代码

分析

二叉树,首先想到迭代或者递归

由于昨天使用了迭代算法比较熟悉,故刚开始时也使用迭代试了一下,发现迭代有个问题是适合直接输出处理结果,但是对遍历节点的关系保留比较麻烦,于是最终选择了递归

递归三部曲:

  • 确认传入参数

传入参数一眼能想到的是,把根节点放进去,其余参数待定,后续有需要再补充

  • 确定退出条件

这个也比较容易想到,当节点为null时退出迭代

  • 处理返回逻辑

这里就比较关键了,但本题不算复杂

按题目要求是返回一个二叉树,那我们就新建一个

并且它的左,右节点要颠倒,那么只需要调换左右节点的位置即可

实现

function mirrorTree(root: TreeNode | null): TreeNode | null {
    if (!root) return null
    return new TreeNode(root.val, mirrorTree(root.right), mirrorTree(root.left))
};
复制代码

题目

剑指 Offer 28. 对称的二叉树

请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。

示例:

例如,二叉树 [1,2,2,3,4,4,3] 是对称的。

1
   / \
  2   2
 / \ / \
3  4 4  3
复制代码

但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:

1
   / \
  2   2
   \   \
   3    3
复制代码

分析一

使用递归

递归三步走,开始分析递归函数怎么写

  • 确定输入参数

本题的输入参数如果一开始对比对逻辑没想清楚时会比较难定得下来,先写下我一开始的思路

要确定一颗树是否和它的镜像一样,可以拿这颗树分别来按不同的方向来进行遍历

那么输入的参数就应该是两个节点,来进行对比

  • 确定终止条件

当左右输入的两个节点都为 null 的时候,说明遍历完成,返回 true

  • 确定返回值

本题最终返回值是一个 boolean 值,那么考虑如何以判断结果直接返回

经分析除边界外有两种情况

两个端点同时存在时,返回判断结果,并进行下一层的递归(分为两个方向,这里存在重复计算,后续第二种方式继续优化)

如果只有单边存在,那说明不符合要求,直接返回 false

实现

function isSymmetric(root: TreeNode | null): boolean {
    function handle (l, r) {
        if (l == null && r == null) return true
        if (l && r) {
            return l.val == r.val && handle(l.left, r.right) && handle(l.right, r.left)
        } else {
            return false
        }
    }
    return handle(root, root)
};
复制代码

分析二

在迭代的解法中,这里利用了双端队列的数据结构来进行遍历

即:重复在头尾进行操作

取出两端的节点进行比对

相同的,则把这两个节点的子节点,按照在两端同时添加外侧元素和在两端同时添加里侧元素的形式,进行下一层节点的遍历

同样,当两个节点都为null时,说明该侧遍历结束

只要出现值不同或者某一层只存在单节点时,说明不符合要求,返回 false

全部遍历完成,返回 true

实现

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

热门文章

最新文章