墨风如雪博客

  • 源码小店
  • 传家宝VPS
让AI使用变得如此简单
  1. 首页
  2. 算法
  3. 正文

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

2023年 7月 26日 243点热度 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日

墨风如雪

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

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

文章评论

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

墨风如雪

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

最新 热点 随机
最新 热点 随机
告别拼凑感!商汤Seko 2.0让“一人剧组”量产百集爆款短剧 谷歌掀桌子:Gemini Deep Research 让深度思考进入白菜价时代 告别AI塑料感:阿里Qwen3-Omni-Flash要把大模型做成真人 GPT-5.2深夜炸场:为了让你每周少干10小时,OpenAI拼了 告别机械音!VoxCPM 1.5开源,这才是我们要的“最强嘴替” Mistral 掀桌了:Devstral 2 与 Vibe CLI 重塑开源编程体验
字节TRAE SOLO:你的AI编程副驾已上线!阿里AI的“船票之战”:千问APP剑指C端,能否重塑格局?Grok 4.1:马斯克AI的里程碑式飞跃,它到底有多强?谷歌Gemini 3:当AI开始“自己动手”,我们离未来更近一步代码界震动!OpenAI的GPT-5.1-Codex-Max颠覆生产力?谷歌Nano Banana Pro:AI画图迈向专业
文心5.0:2.4万亿参数的“全能AI”,它真做到了吗? 美团外卖搭上 DeepSeek 这趟 AI 快车,外卖界要变天啦! 主流AI对话产品侧重点与综合体验指南 双面魔术师:Wan2.2-Animate,让视频焕发生机 微软MAI-Image-1:告别依赖,自研图像AI能否破局? MySQL 事务隔离级别详解:读未提交、读提交、可重复读和串行化
标签聚合
AI spring 设计模式 教程 算法 大模型 deepseek java

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

Theme Kratos Made By Seaton Jiang