算法训练Day16|● 层序遍历 10 ● 226.翻转二叉树 ● 101.对称二叉树 2

简介: 算法训练Day16|● 层序遍历 10 ● 226.翻转二叉树 ● 101.对称二叉树 2

LeetCode:层序遍历 10

二叉树的层序遍历-力扣(leetcode)

1.思路:

递归实现层序遍历,需要deep记录深度便于数值插入对应层的子序列中。

①确定递归函数的参数和返回值:当前节点及其深度deep

②确定终止条件:当前节点为空时返回

③确定单层递归逻辑:

2.代码实现

 1class Solution {
 2    List<List<Integer>> resList = new ArrayList<>();
 3    public List<List<Integer>> levelOrder(TreeNode root) {
 4        //确定递归参数及返回值
 5        levelTraversal(root, 0);
 6        return resList;
 7    }
 8
 9    // 确定单层递归逻辑
10    public void levelTraversal(TreeNode root, Integer deep) {
11        if (root == null) {
12            return;
13        }
14        deep++;
15
16        if (resList.size() < deep) {
17            List<Integer> item = new ArrayList<>();
18            resList.add(item);
19        }
20        resList.get(deep - 1).add(root.val);
21        levelTraversal(root.left, deep);
22        levelTraversal(root.right,deep);
23    }
24}

3.复杂度分析

时间复杂度:O(logn)

空间复杂度:创建了结果集和相应的子模块,O(n)

LeetCode:226.翻转二叉树

226.翻转二叉树-力扣(leetcode)

1.思路:

翻转二叉树,只需要保证根节点下的所有节点翻转一次即可。

翻转需要遍历到每个节点,因此要考虑遍历顺序,前中后都可以,交换节点语句的位置就是遍历的顺序。

具体依旧是:递归三部曲

前序遍历:从根节点反转

后序遍历:从叶子节点反转

2.代码实现:

 1// 后续遍历:遍历到叶子节点,遍历到底部,之后返回的过程中向上去交换。
 2class Solution {
 3    public TreeNode invertTree(TreeNode root) {
 4        // 获取左右节点,遍历交换数值或节点的指向即可
 5        // 确定终止条件
 6        if (root == null) {
 7            return null;
 8        }
 9        // 自己调用自己,深度遍历
10        invertTree(root.left);
11        invertTree(root.right);
12
13        // 确定递归函数的参数与返回值
14        swapTreeNode(root);
15        return root;
16
17    }
18    // 确定单层递归的逻辑
19    public void swapTreeNode(TreeNode root) {
20        TreeNode tmpNode = root.left;
21        root.left = root.right;
22        root.right = tmpNode;
23    }
24}
 1// 前序遍历:直接从根节点进行反转,直到叶子节点结束
 2class Solution {
 3    public TreeNode invertTree(TreeNode root) {
 4        // 获取左右节点,遍历交换数值或节点的指向即可
 5        // 确定终止条件
 6        if (root == null) {
 7            return null;
 8        }
 9        // 确定递归函数的参数与返回值
10        swapTreeNode(root);
11        // 自己调用自己,深度遍历
12        invertTree(root.left);
13        invertTree(root.right);
14
15
16        return root;
17
18    }
19    // 确定单层递归的逻辑
20    public void swapTreeNode(TreeNode root) {
21        TreeNode tmpNode = root.left;
22        root.left = root.right;
23        root.right = tmpNode;
24    }
25}

3.复杂度分析:

时间复杂度:O(logn)

空间复杂度:O(1)


LeetCode:101.对称二叉树2

101. 对称二叉树 - 力扣(LeetCode)


1.思路:

根绝对称二叉树的特点,进行对称的遍历比较二叉树上的值,分为外侧和内侧两种情况。每种情况下,不对成的条件是,左空右不空、右空左不空、左右均不空但值不相同,最终得到左右均空且前面的值相同。


2.代码实现:

 1class Solution {
 2    public boolean isSymmetric(TreeNode root) {
 3        // 遍历,递归??什么顺序??? 不需要每个数值,排除法排除掉不等的情况
 4        // 比较数值,怎么比较??——左子树左侧和右子树右侧 && 左子树右侧和右子树左侧,两者均为true,则返回true
 5        return compare(root.left, root.right);
 6    }
 7
 8    public boolean compare(TreeNode left, TreeNode right) {
 9        if (left == null && right != null) {
10            return false;
11        } else if (left != null && right == null) {
12            return false;
13        } else if (left == null && right == null) {
14            return true;
15        } else if (left.val != right.val) {
16            return false;
17        }
18        // 比较外侧值
19        boolean compareOutside = compare(left.left, right.right);
20        // 比较内侧值
21        boolean compareInside = compare(left.right, right.left);
22        return compareOutside && compareInside;
23    }

3.复杂度分析:

时间复杂度:O(logn)

空间复杂度:O(1)


参考:

代码随想录 (programmercarl.com)







相关文章
|
9天前
|
存储 算法 测试技术
【C++数据结构——树】二叉树的遍历算法(头歌教学实验平台习题) 【合集】
本任务旨在实现二叉树的遍历,包括先序、中序、后序和层次遍历。首先介绍了二叉树的基本概念与结构定义,并通过C++代码示例展示了如何定义二叉树节点及构建二叉树。接着详细讲解了四种遍历方法的递归实现逻辑,以及层次遍历中队列的应用。最后提供了测试用例和预期输出,确保代码正确性。通过这些内容,帮助读者理解并掌握二叉树遍历的核心思想与实现技巧。
32 2
|
24天前
|
存储 算法 Python
文件管理系统中基于 Python 语言的二叉树查找算法探秘
在数字化时代,文件管理系统至关重要。本文探讨了二叉树查找算法在文件管理中的应用,并通过Python代码展示了其实现过程。二叉树是一种非线性数据结构,每个节点最多有两个子节点。通过文件名的字典序构建和查找二叉树,能高效地管理和检索文件。相较于顺序查找,二叉树查找每次比较可排除一半子树,极大提升了查找效率,尤其适用于海量文件管理。Python代码示例包括定义节点类、插入和查找函数,展示了如何快速定位目标文件。二叉树查找算法为文件管理系统的优化提供了有效途径。
50 5
|
2月前
|
算法
分享一些提高二叉树遍历算法效率的代码示例
这只是简单的示例代码,实际应用中可能还需要根据具体需求进行更多的优化和处理。你可以根据自己的需求对代码进行修改和扩展。
|
2月前
|
存储 缓存 算法
如何提高二叉树遍历算法的效率?
选择合适的遍历算法,如按层次遍历树时使用广度优先搜索(BFS),中序遍历二叉搜索树以获得有序序列。优化数据结构,如使用线索二叉树减少空指针判断,自定义节点类增加辅助信息。利用递归与非递归的特点,避免栈溢出问题。多线程并行遍历提高速度,注意线程安全。缓存中间结果,避免重复计算。预先计算并存储信息,提高遍历效率。综合运用这些方法,提高二叉树遍历算法的效率。
74 5
|
3月前
|
存储 机器学习/深度学习 算法
蓝桥杯练习题(三):Python组之算法训练提高综合五十题
蓝桥杯Python编程练习题的集合,涵盖了从基础到提高的多个算法题目及其解答。
137 3
蓝桥杯练习题(三):Python组之算法训练提高综合五十题
|
2月前
|
机器学习/深度学习 JSON 算法
二叉树遍历算法的应用场景有哪些?
【10月更文挑战第29天】二叉树遍历算法作为一种基础而重要的算法,在许多领域都有着不可或缺的应用,它为解决各种复杂的问题提供了有效的手段和思路。随着计算机科学的不断发展,二叉树遍历算法也在不断地被优化和扩展,以适应新的应用场景和需求。
73 0
|
2月前
|
分布式计算 Java 开发工具
阿里云MaxCompute-XGBoost on Spark 极限梯度提升算法的分布式训练与模型持久化oss的实现与代码浅析
本文介绍了XGBoost在MaxCompute+OSS架构下模型持久化遇到的问题及其解决方案。首先简要介绍了XGBoost的特点和应用场景,随后详细描述了客户在将XGBoost on Spark任务从HDFS迁移到OSS时遇到的异常情况。通过分析异常堆栈和源代码,发现使用的`nativeBooster.saveModel`方法不支持OSS路径,而使用`write.overwrite().save`方法则能成功保存模型。最后提供了完整的Scala代码示例、Maven配置和提交命令,帮助用户顺利迁移模型存储路径。
|
3月前
|
存储 算法 关系型数据库
数据结构与算法学习二一:多路查找树、二叉树与B树、2-3树、B+树、B*树。(本章为了解基本知识即可,不做代码学习)
这篇文章主要介绍了多路查找树的基本概念,包括二叉树的局限性、多叉树的优化、B树及其变体(如2-3树、B+树、B*树)的特点和应用,旨在帮助读者理解这些数据结构在文件系统和数据库系统中的重要性和效率。
39 0
数据结构与算法学习二一:多路查找树、二叉树与B树、2-3树、B+树、B*树。(本章为了解基本知识即可,不做代码学习)
|
2天前
|
算法 数据安全/隐私保护 计算机视觉
基于Retinex算法的图像去雾matlab仿真
本项目展示了基于Retinex算法的图像去雾技术。完整程序运行效果无水印,使用Matlab2022a开发。核心代码包含详细中文注释和操作步骤视频。Retinex理论由Edwin Land提出,旨在分离图像的光照和反射分量,增强图像对比度、颜色和细节,尤其在雾天条件下表现优异,有效解决图像去雾问题。
|
2天前
|
算法 数据可视化 安全
基于DWA优化算法的机器人路径规划matlab仿真
本项目基于DWA优化算法实现机器人路径规划的MATLAB仿真,适用于动态环境下的自主导航。使用MATLAB2022A版本运行,展示路径规划和预测结果。核心代码通过散点图和轨迹图可视化路径点及预测路径。DWA算法通过定义速度空间、采样候选动作并评估其优劣(目标方向性、障碍物距离、速度一致性),实时调整机器人运动参数,确保安全避障并接近目标。

热门文章

最新文章