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

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

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
};
相关文章
|
1月前
|
存储 算法 安全
2024重生之回溯数据结构与算法系列学习之串(12)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丟脸好嘛?】
数据结构与算法系列学习之串的定义和基本操作、串的储存结构、基本操作的实现、朴素模式匹配算法、KMP算法等代码举例及图解说明;【含常见的报错问题及其对应的解决方法】你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
2024重生之回溯数据结构与算法系列学习之串(12)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丟脸好嘛?】
|
1月前
|
算法 搜索推荐 数据库
二分搜索:高效的查找算法
【10月更文挑战第29天】通过对二分搜索的深入研究和应用,我们可以不断挖掘其潜力,为各种复杂问题提供高效的解决方案。相信在未来的科技发展中,二分搜索将继续发挥着重要的作用,为我们的生活和工作带来更多的便利和创新。
52 1
|
1月前
|
算法 安全 搜索推荐
2024重生之回溯数据结构与算法系列学习(8)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第2.3章之IKUN和I原达人之数据结构与算法系列学习x单双链表精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
1月前
|
存储 算法 安全
2024重生之回溯数据结构与算法系列学习之顺序表【无论是王道考研人还真爱粉都能包会的;不然别给我家鸽鸽丢脸好嘛?】
顺序表的定义和基本操作之插入;删除;按值查找;按位查找等具体详解步骤以及举例说明
|
1月前
|
算法 安全 搜索推荐
2024重生之回溯数据结构与算法系列学习之单双链表精题详解(9)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第2.3章之IKUN和I原达人之数据结构与算法系列学习x单双链表精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
1月前
|
存储 Web App开发 算法
2024重生之回溯数据结构与算法系列学习之单双链表【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构之单双链表按位、值查找;[前后]插入;删除指定节点;求表长、静态链表等代码及具体思路详解步骤;举例说明、注意点及常见报错问题所对应的解决方法
|
1月前
|
算法 安全 NoSQL
2024重生之回溯数据结构与算法系列学习之栈和队列精题汇总(10)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第3章之IKUN和I原达人之数据结构与算法系列学习栈与队列精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
1月前
|
算法 安全 NoSQL
2024重生之回溯数据结构与算法系列学习之顺序表习题精讲【无论是王道考研人还真爱粉都能包会的;不然别给我家鸽鸽丢脸好嘛?】
顺序表的定义和基本操作之插入;删除;按值查找;按位查找习题精讲等具体详解步骤以及举例说明
|
1月前
|
存储 算法 安全
2024重生之回溯数据结构与算法系列学习【无论是王道考研人还真爱粉都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构的基本概念;算法的基本概念、特性以及时间复杂度、空间复杂度等举例说明;【含常见的报错问题及其对应的解决方法】
|
2月前
|
算法 决策智能
基于禁忌搜索算法的VRP问题求解matlab仿真,带GUI界面,可设置参数
该程序基于禁忌搜索算法求解车辆路径问题(VRP),使用MATLAB2022a版本实现,并带有GUI界面。用户可通过界面设置参数并查看结果。禁忌搜索算法通过迭代改进当前解,并利用记忆机制避免陷入局部最优。程序包含初始化、定义邻域结构、设置禁忌列表等步骤,最终输出最优路径和相关数据图表。

热门文章

最新文章