算法训练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)







相关文章
|
11天前
|
算法
分享一些提高二叉树遍历算法效率的代码示例
这只是简单的示例代码,实际应用中可能还需要根据具体需求进行更多的优化和处理。你可以根据自己的需求对代码进行修改和扩展。
|
14天前
|
存储 缓存 算法
如何提高二叉树遍历算法的效率?
选择合适的遍历算法,如按层次遍历树时使用广度优先搜索(BFS),中序遍历二叉搜索树以获得有序序列。优化数据结构,如使用线索二叉树减少空指针判断,自定义节点类增加辅助信息。利用递归与非递归的特点,避免栈溢出问题。多线程并行遍历提高速度,注意线程安全。缓存中间结果,避免重复计算。预先计算并存储信息,提高遍历效率。综合运用这些方法,提高二叉树遍历算法的效率。
36 5
|
17天前
|
机器学习/深度学习 JSON 算法
二叉树遍历算法的应用场景有哪些?
【10月更文挑战第29天】二叉树遍历算法作为一种基础而重要的算法,在许多领域都有着不可或缺的应用,它为解决各种复杂的问题提供了有效的手段和思路。随着计算机科学的不断发展,二叉树遍历算法也在不断地被优化和扩展,以适应新的应用场景和需求。
24 0
|
1月前
|
存储 机器学习/深度学习 算法
蓝桥杯练习题(三):Python组之算法训练提高综合五十题
蓝桥杯Python编程练习题的集合,涵盖了从基础到提高的多个算法题目及其解答。
60 3
蓝桥杯练习题(三):Python组之算法训练提高综合五十题
|
21天前
|
分布式计算 Java 开发工具
阿里云MaxCompute-XGBoost on Spark 极限梯度提升算法的分布式训练与模型持久化oss的实现与代码浅析
本文介绍了XGBoost在MaxCompute+OSS架构下模型持久化遇到的问题及其解决方案。首先简要介绍了XGBoost的特点和应用场景,随后详细描述了客户在将XGBoost on Spark任务从HDFS迁移到OSS时遇到的异常情况。通过分析异常堆栈和源代码,发现使用的`nativeBooster.saveModel`方法不支持OSS路径,而使用`write.overwrite().save`方法则能成功保存模型。最后提供了完整的Scala代码示例、Maven配置和提交命令,帮助用户顺利迁移模型存储路径。
|
1月前
|
存储 算法 关系型数据库
数据结构与算法学习二一:多路查找树、二叉树与B树、2-3树、B+树、B*树。(本章为了解基本知识即可,不做代码学习)
这篇文章主要介绍了多路查找树的基本概念,包括二叉树的局限性、多叉树的优化、B树及其变体(如2-3树、B+树、B*树)的特点和应用,旨在帮助读者理解这些数据结构在文件系统和数据库系统中的重要性和效率。
22 0
数据结构与算法学习二一:多路查找树、二叉树与B树、2-3树、B+树、B*树。(本章为了解基本知识即可,不做代码学习)
|
1月前
|
存储 算法 搜索推荐
数据结构与算法学习十七:顺序储存二叉树、线索化二叉树
这篇文章主要介绍了顺序存储二叉树和线索化二叉树的概念、特点、实现方式以及应用场景。
25 0
数据结构与算法学习十七:顺序储存二叉树、线索化二叉树
|
1月前
|
存储 算法
数据结构与算法学习十六:树的知识、二叉树、二叉树的遍历(前序、中序、后序、层次)、二叉树的查找(前序、中序、后序、层次)、二叉树的删除
这篇文章主要介绍了树和二叉树的基础知识,包括树的存储方式、二叉树的定义、遍历方法(前序、中序、后序、层次遍历),以及二叉树的查找和删除操作。
25 0
|
29天前
|
算法 安全 数据安全/隐私保护
基于game-based算法的动态频谱访问matlab仿真
本算法展示了在认知无线电网络中,通过游戏理论优化动态频谱访问,提高频谱利用率和物理层安全性。程序运行效果包括负载因子、传输功率、信噪比对用户效用和保密率的影响分析。软件版本:Matlab 2022a。完整代码包含详细中文注释和操作视频。
|
6天前
|
算法 数据安全/隐私保护 索引
OFDM系统PAPR算法的MATLAB仿真,对比SLM,PTS以及CAF,对比不同傅里叶变换长度
本项目展示了在MATLAB 2022a环境下,通过选择映射(SLM)与相位截断星座图(PTS)技术有效降低OFDM系统中PAPR的算法实现。包括无水印的算法运行效果预览、核心程序及详尽的中文注释,附带操作步骤视频,适合研究与教学使用。