算法最优解 算法最优解
首页
目录
赞助
GitHub (opens new window)
首页
目录
赞助
GitHub (opens new window)
  • 数据结构基础

  • 数组

  • 位运算

  • 动态规划

  • 图

  • 区间

  • 链表

  • 矩阵

  • 字符串

  • 树

    • 二叉树的最大深度
    • 相同的树
    • 翻转二叉树
      • 题目描述
      • 思路解析
      • C++代码
      • 复杂度分析
    • 二叉树中的最大路径和
    • 二叉树的层序遍历
    • 二叉树的序列化与反序列化
    • 另一棵树的子树
    • 从前序与中序遍历序列构造二叉树
    • 验证二叉搜索树
    • 二叉搜索树中第K小的元素
    • 二叉搜索树的最近公共祖先
    • 实现 Trie (前缀树)
    • 添加与搜索单词 - 数据结构设计
    • 单词搜索 II
  • 堆

  • 逻辑思维

  • 目录
  • 树
华南溜达虎
2024-07-08
目录

翻转二叉树

题目链接: https://leetcode.cn/problems/invert-binary-tree/

# LeetCode 226. 翻转二叉树

# 题目描述

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

举个例子:

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

# 思路解析

递归可以分为两步:递归结束条件的处理和独立子问题的划分。

在这里翻转二叉树可以划分为翻转二叉树的左子树和翻转二叉树的右子树两个独立子问题。

只要在翻转二叉树的左右子树以后,对二叉树的左右子树进行交换就可以完成整棵树的翻转。

递归是函数一层一层调用的过程,函数调用实际上是一个入栈出栈的过程,这里的栈就是函数调用栈,你可以用gdb调试一个程序通过bt命令来查看函数调用栈。这里的递归函数是invertTree,它的入参是二叉树的根节点,返回值为是翻转后的二叉树。

整个递归的过程如下图:

# C++代码

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    TreeNode* invertTree(TreeNode* root) {

        if (!root) {
            return root;
        }
        root->left = invertTree(root->left);
        root->right = invertTree(root->right);

        TreeNode* tmp = root->left;
        root->left = root->right;
        root->right = tmp;
        return root;
    }
};

# 复杂度分析

时间复杂度: 因为需要遍历整棵树所有的节点,所以时间复杂度跟树的总节点数相关。

空间复杂度: 因为使用了递归,需要用到一个栈来保存函数的调用,栈的最大长度为树的高度,所以空间复杂度跟树的高度有关。

上次更新: 2024/07/08, 20:31:33
相同的树
二叉树中的最大路径和

← 相同的树 二叉树中的最大路径和→

Theme by Vdoing | Copyright © 2024-2024 华南溜达虎 | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式