墨风如雪博客

  • 源码小店
  • 导航站
  • 登录
  • java
  • 资源分享
让AI使用变得如此简单
  1. 首页
  2. 算法
  3. 正文

每日一道算法题:二叉树的最小深度

2023年 7月 26日 93点热度 0人点赞 0条评论

算法比较:深度优先搜索 vs 广度优先搜索

一、概述

A. 问题背景

深度优先搜索和广度优先搜索是两种搜索算法,在图或树中查找特定节点或路径的过程中经常使用。

B. 问题描述

在一个图或树中,查找某个节点或路径。

C. 算法思路

深度优先搜索:从开始节点出发,一直向其相邻未访问过的节点前进,直到找到目标节点或已经完全探索整个图或树。

广度优先搜索:从开始节点出发,首先访问其相邻节点,然后依次访问它们的相邻节点,直到找到目标节点或已经完全探索整个图或树。

二、深度优先搜索

A. 深度优先搜索原理

深度优先搜索从某个节点(通常是根节点)开始遍历图或树,在搜索时,尽可能深地访问每个节点,直到无法继续或找到目标节点为止。

B. 深度优先搜索实现

可以使用递归实现深度优先搜索。 也可以使用栈模拟递归过程来实现非递归的深度优先搜索。 JAVA代码:

递归实现:

public void dfs(Node node, boolean[] visited) {
    visited[node.val] = true;
    System.out.println(node.val);
    for (Node n : node.next) {
        if (!visited[n.val]) {
            dfs(n, visited);
        }
    }
}

非递归实现:

public void dfs(Node node, boolean[] visited) {
    Stack<Node> stack = new Stack<>();
    stack.push(node);

    while (!stack.empty()) {
        Node curr = stack.pop();
        visited[curr.val] = true;
        System.out.println(curr.val);

        for (Node n : curr.next) {
            if (!visited[n.val]) {
                stack.push(n);
            }
        }
    }
}

C. 深度优先搜索优缺点

优点:

  • 实现简单明了,易于理解和实现。
  • 占用的空间较少,当找到目标节点时,就可以停止搜索。

缺点:

  • 可能会陷入死循环,需要避免重复访问节点。

三、广度优先搜索

A. 广度优先搜索原理

广度优先搜索从某个节点开始遍历图或树,在搜索时,尽可能宽地访问每个节点,即先访问与开始节点相邻的所有节点,然后依次访问第二层相邻节点,直到找到目标节点为止。

B. 广度优先搜索实现

可以使用队列实现广度优先搜索。 JAVA代码:

public void bfs(Node node, boolean[] visited) {
    Queue<Node> queue = new LinkedList<>();
    queue.offer(node);

    while (!queue.isEmpty()) {
        Node curr = queue.poll();
        visited[curr.val] = true;
        System.out.println(curr.val);

        for (Node n : curr.next) {
            if (!visited[n.val]) {
                queue.offer(n);
            }
        }
    }
}

C. 广度优先搜索优缺点

优点:

  • 可以找到最短路径(路径上所有节点数量最少),因为搜索顺序是逐层依次进行的。

缺点:

  • 实现相对较复杂,需要使用队列进行实现。
  • 占用的空间较多,需要一次性存储所有等待访问的节点。

四、比较深度优先搜索和广度优先搜索

A. 时间复杂度分析

在最坏情况下,在n个节点的图或树中找到特定节点或路径的时间复杂度,深度优先搜索为O(n),广度优先搜索为O(n^2)。

B. 空间复杂度分析

在最坏情况下,在n个节点的图或树中找到特定节点或路径的空间复杂度,深度优先搜索为O(h),其中h为最大深度;广度优先搜索为O(n),需要存储每层节点。

C. 应用场景比较

深度优先搜索适合用于查找目标节点深度较大的图或树,或者需要遍历整个图或树的情况。广度优先搜索适合用于查找目标节点深度较小的图或树,或者需要找到最短路径的情况。

五、算法优化

A. 减少空间复杂度

可以使用双向广度优先搜索来减少空间复杂度,它在开始节点和目标节点分别进行广度优先搜索,直到发现两边都访问了某个节点,此时可以得出最短路径。

B. 优化代码实现

可以使用位运算来减少代码实现中的比较操作,提高代码执行效率。例如,使用按位与运算代替布尔值相乘运算。

六、扩展点

A. 二叉树遍历方式

在二叉树中,有三种遍历方式:先序遍历、中序遍历、后序遍历。先序遍历是指先访问根节点,然后依次访问左子树和右子树;中序遍历是指先访问左子树,然后访问根节点,最后访问右子树;后序遍历是指先访问左子树,然后访问右子树,最后访问根节点。

B. 二叉树节点值的计算方式

在二叉树中,每个节点都有一个值,可以通过不同的方式计算节点值。例如,可以计算二叉树叶节点的总和,或者二叉树中每个节点与根节点的差值的绝对值的总和。

七、总结

深度优先搜索和广度优先搜索都是常用的图或树搜索算法,它们分别适用于不同的特定情况。在实际应用中,可以根据具体问题的特点选用适合的算法。除此之外,还可以通过算法优化来提高代码执行效率和减少空间复杂度。

本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: java 二叉树 动态规划 数组 算法
最后更新:2023年 6月 23日

墨风如雪

一个热爱生活,热爱分享的程序员

打赏 点赞
< 上一篇
下一篇 >

文章评论

您需要 登录 之后才可以评论

墨风如雪

一个热爱生活,热爱分享的程序员

最新 热点 随机
最新 热点 随机
小红书AI新里程碑:dots.llm1,中文MoE的“人文”突破! 告别机械感!OpenAudio S1让AI声音活起来 Sora触手可及!微软必应AI视频生成器,全民创作时代来临? 阿里WebAgent开源:引领自主搜索新纪元 重磅炸弹!字节跳动开源BAGEL:70亿参数,统一多模态理解与生成,AI“全能王”诞生记! 小米MiMo-VL:7B参数,怎么就成了多模态界的“越级打怪王”?
AI圈炸锅了!Mistral Medium 3:性能 SOTA,成本打骨折,企业玩家的新宠?字节终于开源“扣子”同款引擎了!FlowGram:AI 时代的可视化工作流利器告别“微信黑箱”!Chatlog:让你的聊天记录也能拥有“AI大脑”!字节跳动 Seed-Coder-8B:不靠人工洗数据,这80亿参数的小模型如何写出顶尖代码?85倍速的视觉革命:苹果发布 FastVLM,让你的 iPhone ‘看图说话’,快到飞起!告别AI视频“变脸怪”!腾讯混元Hunyuan Custom重磅开源,主体一致性“王炸”来了!
抽象类和接口的区别(通俗易理解) spring当中确保事务一致性的使用指南 java Web框架SpringBoot的(超详细总结) 告别显存焦虑!Google Gemma-3-27B QAT 版发布:你的 RTX 3090 也能跑顶尖大模型了! NoSQL数据库Apache Cassandra你知道多少? 设计模式:建造者设计模式
标签聚合
动态规划 spring java deepseek 算法 AI 设计模式 教程

COPYRIGHT © 2023 墨风如雪博客. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

免责声明 - 隐私政策