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







相关文章
|
6月前
|
存储 算法 Java
算法系列之数据结构-二叉树
树是一种重要的非线性数据结构,广泛应用于各种算法和应用中。本文介绍了树的基本概念、常见类型(如二叉树、满二叉树、完全二叉树、平衡二叉树、B树等)及其在Java中的实现。通过递归方法实现了二叉树的前序、中序、后序和层次遍历,并展示了具体的代码示例和运行结果。掌握树结构有助于提高编程能力,优化算法设计。
188 10
 算法系列之数据结构-二叉树
|
10月前
|
算法
分享一些提高二叉树遍历算法效率的代码示例
这只是简单的示例代码,实际应用中可能还需要根据具体需求进行更多的优化和处理。你可以根据自己的需求对代码进行修改和扩展。
264 64
|
8月前
|
存储 算法 测试技术
【C++数据结构——树】二叉树的遍历算法(头歌教学实验平台习题) 【合集】
本任务旨在实现二叉树的遍历,包括先序、中序、后序和层次遍历。首先介绍了二叉树的基本概念与结构定义,并通过C++代码示例展示了如何定义二叉树节点及构建二叉树。接着详细讲解了四种遍历方法的递归实现逻辑,以及层次遍历中队列的应用。最后提供了测试用例和预期输出,确保代码正确性。通过这些内容,帮助读者理解并掌握二叉树遍历的核心思想与实现技巧。
259 3
|
9月前
|
存储 算法 Python
文件管理系统中基于 Python 语言的二叉树查找算法探秘
在数字化时代,文件管理系统至关重要。本文探讨了二叉树查找算法在文件管理中的应用,并通过Python代码展示了其实现过程。二叉树是一种非线性数据结构,每个节点最多有两个子节点。通过文件名的字典序构建和查找二叉树,能高效地管理和检索文件。相较于顺序查找,二叉树查找每次比较可排除一半子树,极大提升了查找效率,尤其适用于海量文件管理。Python代码示例包括定义节点类、插入和查找函数,展示了如何快速定位目标文件。二叉树查找算法为文件管理系统的优化提供了有效途径。
146 5
|
10月前
|
存储 缓存 算法
如何提高二叉树遍历算法的效率?
选择合适的遍历算法,如按层次遍历树时使用广度优先搜索(BFS),中序遍历二叉搜索树以获得有序序列。优化数据结构,如使用线索二叉树减少空指针判断,自定义节点类增加辅助信息。利用递归与非递归的特点,避免栈溢出问题。多线程并行遍历提高速度,注意线程安全。缓存中间结果,避免重复计算。预先计算并存储信息,提高遍历效率。综合运用这些方法,提高二叉树遍历算法的效率。
263 5
|
10月前
|
机器学习/深度学习 JSON 算法
二叉树遍历算法的应用场景有哪些?
【10月更文挑战第29天】二叉树遍历算法作为一种基础而重要的算法,在许多领域都有着不可或缺的应用,它为解决各种复杂的问题提供了有效的手段和思路。随着计算机科学的不断发展,二叉树遍历算法也在不断地被优化和扩展,以适应新的应用场景和需求。
480 0
|
10月前
|
分布式计算 Java 开发工具
阿里云MaxCompute-XGBoost on Spark 极限梯度提升算法的分布式训练与模型持久化oss的实现与代码浅析
本文介绍了XGBoost在MaxCompute+OSS架构下模型持久化遇到的问题及其解决方案。首先简要介绍了XGBoost的特点和应用场景,随后详细描述了客户在将XGBoost on Spark任务从HDFS迁移到OSS时遇到的异常情况。通过分析异常堆栈和源代码,发现使用的`nativeBooster.saveModel`方法不支持OSS路径,而使用`write.overwrite().save`方法则能成功保存模型。最后提供了完整的Scala代码示例、Maven配置和提交命令,帮助用户顺利迁移模型存储路径。
|
5天前
|
传感器 机器学习/深度学习 算法
【使用 DSP 滤波器加速速度和位移】使用信号处理算法过滤加速度数据并将其转换为速度和位移研究(Matlab代码实现)
【使用 DSP 滤波器加速速度和位移】使用信号处理算法过滤加速度数据并将其转换为速度和位移研究(Matlab代码实现)
|
6天前
|
传感器 算法 数据挖掘
基于协方差交叉(CI)的多传感器融合算法matlab仿真,对比单传感器和SCC融合
基于协方差交叉(CI)的多传感器融合算法,通过MATLAB仿真对比单传感器、SCC与CI融合在位置/速度估计误差(RMSE)及等概率椭圆上的性能。采用MATLAB2022A实现,结果表明CI融合在未知相关性下仍具鲁棒性,有效降低估计误差。
|
7天前
|
负载均衡 算法 调度
基于遗传算法的新的异构分布式系统任务调度算法研究(Matlab代码实现)
基于遗传算法的新的异构分布式系统任务调度算法研究(Matlab代码实现)
76 11

热门文章

最新文章