![在这里插入图片描述](https://img-blog.csdnimg.cn/7bd3cd5ef8154d7da99e5cd9badf12f4.png#pic_center)
题目
给你一棵二叉树的根节点
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
思路
- 观察一下翻转后的二叉树,与原二叉树有什么区别呢?以示例一为例,可以看到4的左右节点7和2位置互换,2的左右节点1和3位置互换,7的左右节点6和9位置互换
- 根据上面的分析,我们只需要翻转每一个节点的左右子树即可。
- 要翻转每一个节点的左右子树,那么就要遍历二叉树所有节点,遍历方式选择前序、后序、中序、层序到可以,具体到写法上也有递归和迭代,看自己哪个熟选哪个就好。
代码
- 递归写法(前序遍历)
/**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
*/
/**
* @param {TreeNode} root
* @return {TreeNode}
*/
var invertTree = function(root) {
function reverseSon(node){
// 结束递归的条件是左右节点都为空
if(!node.left && !node.right) return
// 交换左右子树的位置
const temp = node.left
node.left = node.right
node.right = temp
// 递归左右子树
if(node.left) reverseSon(node.left)
if(node.right) reverseSon(node.right)
}
if(!root) return root
reverseSon(root)
return root
};
- 迭代写法(层序遍历)
/**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
*/
/**
* @param {TreeNode} root
* @return {TreeNode}
*/
var invertTree = function(root) {
if(!root) return root
let queue = [root]
while(queue.length){
const cur = queue.shift()
// 如果左右子树都为null,则跳过本轮循环
if(!cur.left && !cur.right) continue
if(cur.left) queue.push(cur.left)
if(cur.right) queue.push(cur.right)
// 交换左右子树
const temp = cur.left
cur.left = cur.right
cur.right = temp
}
return root
};
关注我的专栏,每天更新三道leetcode题解,一起变强!