LeetCode探索(26):226-翻转二叉树

96 阅读2分钟

「这是我参与2022首次更文挑战的第12天,活动详情查看:2022首次更文挑战」。

题目

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

示例 1:

img1

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

示例 2:

img

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

示例 3:

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

提示:

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

思考

这是二叉树相关的一道题目,难度简单。

从实例的图中我们可以清楚地看到,翻转二叉树指的是将每一对左右子树互换位置。为了翻转题目给出的二叉树,像之前做过的题目,我们有递归和迭代两种解决方法。

前面做过几道类似的二叉树题目了,尽管题目要求不一样,但是解决此类题目的思路是一致的。简单地比较,递归是调用函数自身去解决问题,而迭代是通过借助队列,每次将每一层的根节点或左右子树存入队列中,再取出并交换左右子树节点。

话不多说,下面展示这两种不同的解法。

解答

方法一:递归

/**
 * @param {TreeNode} root
 * @return {TreeNode}
 */
var invertTree = function(root) {
  if (!root) {
    return null
  }
  const left = invertTree(root.left)
  const right = invertTree(root.right)
  root.left = right
  root.right = left
  return root
}
// 执行用时:64 ms, 在所有 JavaScript 提交中击败了93.39%的用户
// 内存消耗:41.3 MB, 在所有 JavaScript 提交中击败了5.04%的用户

复杂度分析

  • 时间复杂度:O(n)。
  • 空间复杂度:这里递归层数不超过 n,故渐进空间复杂度为 O(n)。

方法二:迭代

/**
 * @param {TreeNode} root
 * @return {TreeNode}
 */
var invertTree = function(root) {
  if(!root) {
    return null
  }
  const q = [] // 队列
  q.push(root)
  while (q.length) {
    // 从队列中取出节点
    let tmp = q.shift()
    // 交换左右子树
    let left = tmp.left
    tmp.left = tmp.right
    tmp.right = left
    // 存入队列中
    if(tmp.left) {
      q.push(tmp.left)
    }
    if(tmp.right) {
      q.push(tmp.right)
    }
  }
  return root
}
// 执行用时:60 ms, 在所有 JavaScript 提交中击败了98.21%的用户
// 内存消耗:41.6 MB, 在所有 JavaScript 提交中击败了5.04%的用户

复杂度分析

  • 时间复杂度:O(n)。
  • 空间复杂度:O(n)。

参考