算法训练Day17|● 104.二叉树的最大深度 559.n叉树的最大深度● 111.二叉树的最小深度● 222.完全二叉树的节点个数

简介: 算法训练Day17|● 104.二叉树的最大深度 559.n叉树的最大深度● 111.二叉树的最小深度● 222.完全二叉树的节点个数

LeetCode:104.二叉树的最大深度

104.二叉树的最大深度-力扣(leetcode)

1.思路

递归方法来实现

理论上,深度应该从根节点计数,直到最深的叶子节点。故采用前序遍历是统一的。

高度应该从叶子节点计数,直到根节点为止。故采用后序遍历时统一的。

但,由于最大深度和最大高度是同一个数值,所以前序遍历和后续遍历结果是一致的。

但,层序遍历应该是最好理解的。


2.代码实现

递归实现

 1// 递归
 2class Solution {
 3    public int maxDepth(TreeNode root) {
 4        if (root == null) {
 5            return 0;
 6        }
 7        int getLeft = maxDepth(root.left);
 8        int getright = maxDepth(root.right);
 9        return Math.max(getLeft, getright) + 1; // 遇到最底层节点进行 +1 操作, 这个过程属于回溯
10    }   
11}
迭代法实现(层序遍历

该代码通过广度优先搜索(BFS)的方式计算二叉树的最大深度。使用一个队列来存储每一层的节点,每次遍历完一层后,深度加1。直到队列为空,即遍历完整个二叉树,返回最大深度。

 1class Solution {
 2    public int maxDepth(TreeNode root) {
 3        if (root == null) { // 如果根节点为空,返回深度为0
 4            return 0;
 5        }
 6        Queue<TreeNode> queue = new LinkedList<>(); // 创建一个队列来存储节点
 7        queue.offer(root); // 将根节点加入队列
 8        int ans = 0; // 初始化深度为0
 9        while (!queue.isEmpty()) { // 当队列不为空时循环
10            int size = queue.size(); // 获取当前层的节点数量
11            while (size > 0) { // 遍历当前层的所有节点
12                TreeNode node = queue.poll(); // 从队列中取出一个节点
13                if (node.left != null) { // 如果节点的左子节点不为空,将左子节点加入队列
14                    queue.offer(node.left);
15                }
16                if (node.right != null) { // 如果节点的右子节点不为空,将右子节点加入队列
17                    queue.offer(node.right);
18                }
19                size--; // 当前层节点数量减1
20            }
21            ans++; // 每遍历完一层,深度加1
22        }
23        return ans; // 返回最大深度
24    }
25}

3.复杂度分析

递归:

时间复杂度:O(n),需要遍历到每个节点,故为O(n)

空间复杂度:O(height),用栈存储深度,所以空间消耗为height/depth.

层序:

时间复杂度:O(n),需要遍历到每个节点,故为O(n)

空间复杂度:O(n)+O(size)+O(ans),用队列暂存,额外用到size、ans..


LeetCode:559.n叉树的最大深度

559.N叉树的最大深度-力扣(leetcode)

1.思路

2.代码实现

 1class Solution {
 2    public int minDepth(TreeNode root) {
 3        if (root == null) {
 4            return 0;
 5        }
 6        int getLeft = minDepth(root.left);
 7        int getRight = minDepth(root.right);
 8        // 左子树为null时
 9        if (root.left == null) {
10            return getRight + 1;
11        }
12        // 右子树为null
13        if (root.right == null) {
14            return getLeft + 1;
15        }
16        // 根节点左右子树都不为null时,取两子树较小值
17        return Math.min(getLeft, getRight) + 1;
18    }
19}

3.复杂度分析

时间复杂度:O(logN/2 ✖ logN/2)

空间复杂度:O(1),常数项存储最大深度的数值


LeetCode:111.二叉树的最小深度

111. 二叉树的最小深度 - 力扣(LeetCode)


1.思路

最小深度和最大深度思路基本一致,需要注意的是,要排除根节点左右子树为空的情况。

最小深度是从根节点到最近叶子节点的最短路径上的节点数量。叶子节点是指没有子节点的节点。


2.代码实现

 1class Solution {
 2    public int minDepth(TreeNode root) {
 3        if (root == null) {
 4            return 0;
 5        }
 6        int getLeft = minDepth(root.left);
 7        int getRight = minDepth(root.right);
 8        // 左子树为null时
 9        if (root.left == null) {
10            return getRight + 1;
11        }
12        // 右子树为null
13        if (root.right == null) {
14            return getLeft + 1;
15        }
16        // 根节点左右子树都不为null时,取两子树较小值
17        return Math.min(getLeft, getRight) + 1;
18    }
19}

3.复杂度分析

时间复杂度:遍历每个节点,故为O(N)

空间复杂度:取决于递归时,栈空间的开销。最坏情况下,树呈链状,空间复杂度为O(N),平均情况下树的高度与节点数的对数呈正相关,空间复杂度为O(logN).

LeetCode:222.完全二叉树的节点个数

222.完全二叉树的节点个数-力扣(leetcode)

1.思路

2.代码实现

递归法
 1// 递归实现
 2class Solution {
 3    public int countNodes(TreeNode root) {
 4        if (root == null) {
 5            return 0;
 6        }
 7        int leftCount = countNodes(root.left);
 8        int rightCount = countNodes(root.right);
 9        int sum = leftCount + rightCount + 1;
10        return sum;
11    }
12}
迭代法
 1// 迭代法
 2class Solution {
 3    public int countNodes(TreeNode root) {
 4        if (root == null) {
 5            return 0;
 6        }
 7        Queue<TreeNode> queue = new LinkedList<>(); // 创建层序遍历的辅助队列
 8        queue.offer(root);
 9        int sum = 0;
10        while (!queue.isEmpty()) {
11            int size = queue.size();
12            while (size > 0) {
13                TreeNode cur = queue.poll();
14
15                size--;
16                sum++;
17                if (cur.left != null) {
18                    queue.offer(cur.left);
19                }
20                if (cur.right != null) {
21                    queue.offer(cur.right);
22                }  
23            }
24        }
25        return sum;
26    }
27}

3.复杂度分析

递归法:

时间复杂度:O(logN/2 ✖ logN/2)

空间复杂度:O(N),代码随想录给的是O(logN),存疑!

相关文章
|
3天前
|
算法
分享一些提高二叉树遍历算法效率的代码示例
这只是简单的示例代码,实际应用中可能还需要根据具体需求进行更多的优化和处理。你可以根据自己的需求对代码进行修改和扩展。
|
6天前
|
存储 缓存 算法
如何提高二叉树遍历算法的效率?
选择合适的遍历算法,如按层次遍历树时使用广度优先搜索(BFS),中序遍历二叉搜索树以获得有序序列。优化数据结构,如使用线索二叉树减少空指针判断,自定义节点类增加辅助信息。利用递归与非递归的特点,避免栈溢出问题。多线程并行遍历提高速度,注意线程安全。缓存中间结果,避免重复计算。预先计算并存储信息,提高遍历效率。综合运用这些方法,提高二叉树遍历算法的效率。
21 5
|
6天前
|
算法
树的遍历算法有哪些?
不同的遍历算法适用于不同的应用场景。深度优先搜索常用于搜索、路径查找等问题;广度优先搜索则在图的最短路径、层次相关的问题中较为常用;而二叉搜索树的遍历在数据排序、查找等方面有重要应用。
13 2
|
9天前
|
机器学习/深度学习 JSON 算法
二叉树遍历算法的应用场景有哪些?
【10月更文挑战第29天】二叉树遍历算法作为一种基础而重要的算法,在许多领域都有着不可或缺的应用,它为解决各种复杂的问题提供了有效的手段和思路。随着计算机科学的不断发展,二叉树遍历算法也在不断地被优化和扩展,以适应新的应用场景和需求。
19 0
|
1月前
|
存储 机器学习/深度学习 算法
蓝桥杯练习题(三):Python组之算法训练提高综合五十题
蓝桥杯Python编程练习题的集合,涵盖了从基础到提高的多个算法题目及其解答。
56 3
蓝桥杯练习题(三):Python组之算法训练提高综合五十题
|
14天前
|
分布式计算 Java 开发工具
阿里云MaxCompute-XGBoost on Spark 极限梯度提升算法的分布式训练与模型持久化oss的实现与代码浅析
本文介绍了XGBoost在MaxCompute+OSS架构下模型持久化遇到的问题及其解决方案。首先简要介绍了XGBoost的特点和应用场景,随后详细描述了客户在将XGBoost on Spark任务从HDFS迁移到OSS时遇到的异常情况。通过分析异常堆栈和源代码,发现使用的`nativeBooster.saveModel`方法不支持OSS路径,而使用`write.overwrite().save`方法则能成功保存模型。最后提供了完整的Scala代码示例、Maven配置和提交命令,帮助用户顺利迁移模型存储路径。
|
21天前
|
算法 安全 数据安全/隐私保护
基于game-based算法的动态频谱访问matlab仿真
本算法展示了在认知无线电网络中,通过游戏理论优化动态频谱访问,提高频谱利用率和物理层安全性。程序运行效果包括负载因子、传输功率、信噪比对用户效用和保密率的影响分析。软件版本:Matlab 2022a。完整代码包含详细中文注释和操作视频。
|
6天前
|
算法 数据挖掘 数据安全/隐私保护
基于FCM模糊聚类算法的图像分割matlab仿真
本项目展示了基于模糊C均值(FCM)算法的图像分割技术。算法运行效果良好,无水印。使用MATLAB 2022a开发,提供完整代码及中文注释,附带操作步骤视频。FCM算法通过隶属度矩阵和聚类中心矩阵实现图像分割,适用于灰度和彩色图像,广泛应用于医学影像、遥感图像等领域。
|
7天前
|
算法 调度
基于遗传模拟退火混合优化算法的车间作业最优调度matlab仿真,输出甘特图
车间作业调度问题(JSSP)通过遗传算法(GA)和模拟退火算法(SA)优化多个作业在并行工作中心上的加工顺序和时间,以最小化总完成时间和机器闲置时间。MATLAB2022a版本运行测试,展示了有效性和可行性。核心程序采用作业列表表示法,结合遗传操作和模拟退火过程,提高算法性能。
|
8天前
|
存储 算法 决策智能
基于免疫算法的TSP问题求解matlab仿真
旅行商问题(TSP)是一个经典的组合优化问题,目标是寻找经过每个城市恰好一次并返回起点的最短回路。本文介绍了一种基于免疫算法(IA)的解决方案,该算法模拟生物免疫系统的运作机制,通过克隆选择、变异和免疫记忆等步骤,有效解决了TSP问题。程序使用MATLAB 2022a版本运行,展示了良好的优化效果。