「这是我参与2022首次更文挑战的第12天,活动详情查看:2022首次更文挑战」。
题目
给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。
示例 1:
输入:root = [4,2,7,1,3,6,9]
输出:[4,7,2,9,6,3,1]
示例 2:
输入: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)。