当前位置: 首页 > article >正文

leetcode hot100【LeetCode 226. 翻转二叉树】java实现

LeetCode 226. 翻转二叉树

题目描述

翻转一棵二叉树,即将其所有左右子树进行交换。

示例 1:

输入:root = [4,2,7,1,3,6,9]
输出:[4,7,2,9,6,3,1]

示例 2:

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

示例 3:

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

示例 4:

输入:root = [1,2]
输出:[1,2]

提示:

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

Java 实现解法

方法一:递归
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public TreeNode invertTree(TreeNode root) {
        if (root == null) return null;
        TreeNode temp = root.left;
        root.left = invertTree(root.right);
        root.right = invertTree(temp);
        return root;
    }
}
方法二:迭代
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public TreeNode invertTree(TreeNode root) {
        if (root == null) return null;

        Queue<TreeNode> queue = new LinkedList<>();
        queue.add(root);

        while (!queue.isEmpty()) {
            TreeNode node = queue.poll();

            // 交换当前节点的左右子节点
            TreeNode temp = node.left;
            node.left = node.right;
            node.right = temp;

            // 将左右子节点加入队列
            if (node.left != null) queue.add(node.left);
            if (node.right != null) queue.add(node.right);
        }

        return root;
    }
}

解题思路

方法一:
  • 递归方法
    • 如果当前节点为空,则直接返回 null
    • 交换当前节点的左右子树。
    • 递归地对左右子树进行相同的操作。

这种方法的时间复杂度是 O(n),其中 n 是树中节点的数量,因为每个节点恰好被访问一次。空间复杂度是 O(h),其中 h 是树的高度,这取决于递归调用的栈空间,在最坏情况下(树完全不平衡,如链状结构),空间复杂度为 O(n)。

方法二:
  • 层次遍历(广度优先搜索)
    • 使用一个队列来存储每一层的节点。
    • 如果根节点为空,直接返回 null
    • 初始化一个队列并将根节点加入队列,然后开始遍历。
    • 在每次迭代中,取出队列中的一个节点,交换其左右子树。
    • 将交换后的左右子树(如果它们不为空)加入队列,以便后续处理。

这种方法的时间复杂度是 O(n),其中 n 是树中节点的数量,因为每个节点恰好被访问一次。空间复杂度是 O(m),其中 m 是队列中存储的最大节点数,即树的最大宽度。在最坏情况下,如果树完全不平衡,空间复杂度为 O(n)。


http://www.kler.cn/a/369864.html

相关文章:

  • 提示词的艺术 ---- AI Prompt 进阶(提示词框架)
  • C#AWS signatureV4对接Amazon接口
  • c语言(转义字符)
  • 关于CAN(FD)转以太网详细介绍
  • 仅仅4M!windows系统适用,免费无限制使用!
  • 什么是稀疏 MoE?Doubao-1.5-pro 如何以少胜多?
  • AI 聊天机器人的兴起:GPT-3 和 BERT 如何重新定义对话体验
  • MySQL8 安装配置及卸载教程
  • 17. 云计算和分布式计算
  • 【python】极简教程17-类和方法
  • 在Linux下使用Typora
  • word记录
  • Rust编程与项目实战-元组
  • 数据库->数据库设计
  • YOLOv8实战野生动物识别
  • 如何确保电子商务网站服务器的正常运行时间
  • linux查看系统架构的命令
  • 【Vue3】第三篇
  • 算法练习:四数之和
  • 数组排序简介-选择排序(Selection Sort)
  • ESP8266学习记录
  • 消息中间件mq*(Kafka)
  • 【C++】How the C++ Compiler Works
  • java_方法重载、可变参数、作用域
  • Excel-多表数据查找匹配(VLOOKUP)
  • Chromium HTML5 新的 Input 类型tel对应c++