二叉树——226. 翻转二叉树

简介: 本专栏按照数组—链表—哈希—字符串—栈与队列—二叉树—回溯—贪心—动态规划—单调栈的顺序刷题,采用代码随想录所给的刷题顺序,一个正确的刷题顺序对算法学习是非常重要的,希望对大家有帮助

1 题目描述

给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。

2 题目示例

image.png

image.png

示例 3:

输入:root = []
输出:[]

3 题目提示

树中节点数目范围在 [0, 100] 内
-100 <= Node.val <= 100

4 思路

递归:
这是一道很经典的二叉树问题。显然,我们从根节点开始,递归地对树进行遍历,并从叶子节点先开始翻转。如果当前遍历到的节点root的左右两棵子树都已经翻转,那么我们只需要交换两棵子树的位置,即可完成以root为根节点的整棵子树的翻转。
复杂度分析
时间复杂度:o(N),其中N为二叉树节点的数目。我们会遍历二叉树中的每一个节点,对每个节点而言,我们在常数时间内交换其两棵子树。
·空间复杂度:O(N)。使用的空间由递归栈的深度决定,它等于当前节点在二叉树中的高度。在平均情况下,二叉树的高度与节点个数为对数关系,即O(log N)。而在最坏情况下,树形成链状,空间复杂度为O(N)。

迭代:

递归实现也就是深度优先遍历的方式,那么对应的就是广度优先遍历。
广度优先遍历需要额外的数据结构--队列,来存放临时遍历到的元素。
深度优先遍历的特点是一竿子插到底,不行了再退回来继续;而广度优先遍历的特点是层层扫荡。
所以,我们需要先将根节点放入到队列中,然后不断的迭代队列中的元素。
对当前元素调换其左右子树的位置,然后:
判断其左子树是否为空,不为空就放入队列中判断其右子树是否为空,不为空就放入队列中
时间复杂度:同样每个节点都需要入队列/出队列—次,所以是o(n)
空间复杂度:最坏的情况下会包含所有的叶子节点,完全二叉树叶子节点是n/2个,所以时间复杂度是0(n)

5 我的答案

递归:

class Solution {
    public TreeNode invertTree(TreeNode root) {
        if (root == null) {
            return null;
        }
        TreeNode left = invertTree(root.left);
        TreeNode right = invertTree(root.right);
        root.left = right;
        root.right = left;
        return root;
    }
}

迭代:

class Solution {
    public TreeNode invertTree(TreeNode root) {
        if(root==null) {
            return null;
        }
        //将二叉树中的节点逐层放入队列中,再迭代处理队列中的元素
        LinkedList<TreeNode> queue = new LinkedList<TreeNode>();
        queue.add(root);
        while(!queue.isEmpty()) {
            //每次都从队列中拿一个节点,并交换这个节点的左右子树
            TreeNode tmp = queue.poll();
            TreeNode left = tmp.left;
            tmp.left = tmp.right;
            tmp.right = left;
            //如果当前节点的左子树不为空,则放入队列等待后续处理
            if(tmp.left!=null) {
                queue.add(tmp.left);
            }
            //如果当前节点的右子树不为空,则放入队列等待后续处理
            if(tmp.right!=null) {
                queue.add(tmp.right);
            }
            
        }
        //返回处理完的根节点
        return root;
    }
}
相关文章
|
Web App开发 搜索推荐 Java
|
安全 关系型数据库 PHP
探索PHP:构建现代Web应用的基石
【8月更文挑战第29天】本文将带领读者深入理解PHP的核心概念,从基础语法到面向对象编程,再到数据库操作和安全性实践。我们将通过实例探讨如何利用PHP的灵活性和强大功能,来构建可靠、高效且安全的Web应用程序。无论你是初学者还是有经验的开发者,这篇文章都将为你提供宝贵的见解和实用的技巧。让我们一起探索PHP的世界,释放它的潜力,打造下一代Web应用!
|
存储 大数据 云计算
大数据与云计算
大数据与云计算
932 2
|
运维 监控 安全
构建高效自动化运维体系的五大关键要素
【4月更文挑战第29天】 在当今IT基础设施管理领域,自动化已经成为提升效率、降低错误率和实现快速响应的关键驱动力。本文将探讨构建一个高效自动化运维体系所需关注的五大关键要素:标准化流程、模块化设计、监控与报警机制、持续集成/持续部署(CI/CD)和安全性考量。通过深入分析这些要素,我们旨在为企业提供一个参考框架,以实现更智能、更灵活的运维管理。
|
Serverless 语音技术 开发工具
函数计算操作报错合集之怎么何集成nls tts python sdk
在使用函数计算服务(如阿里云函数计算)时,用户可能会遇到多种错误场景。以下是一些常见的操作报错及其可能的原因和解决方法,包括但不限于:1. 函数部署失败、2. 函数执行超时、3. 资源不足错误、4. 权限与访问错误、5. 依赖问题、6. 网络配置错误、7. 触发器配置错误、8. 日志与监控问题。
178 2
|
前端开发 Dubbo Java
spring面试题_spring mvc面试题_springboot面试题库
spring面试题_spring mvc面试题_springboot面试题库
|
域名解析 Kubernetes JavaScript
如何开发一个完整的Helm charts应用实例(1)
如何开发一个完整的Helm charts应用实例(1)
如何开发一个完整的Helm charts应用实例(1)
|
数据采集 存储 数据挖掘
淘宝app端商品详情数据采集python
淘宝app端商品详情数据采集python
|
机器学习/深度学习 数据采集 人工智能
从零开始构建自己的AI:一个初学者的机器学习教程
通过这个简单的机器学习教程,我们初步了解了从数据收集、选择模型到训练和预测的基本流程。机器学习是一个广阔的领域,有很多知识和技能需要深入学习。希望本教程能为初学者提供一个入门的指引,引导大家探索更多有关机器学习的知识。感谢您阅读本文,如果您有任何问题或想法,请在评论区与我分享!让我们一起踏上机器学习的旅程,构建属于自己的AI。
3765 1
从零开始构建自己的AI:一个初学者的机器学习教程
|
存储
03-isa指针 & superclass指针
03-isa指针 & superclass指针
164 0