题目
给你一棵二叉树的根节点 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
题解
一个二叉树的翻转,即它的左右子树要交换,并且左右子树内的所有子树,都要进行左右子树的交换
使用递归,自底向上进行左右子树的交换。
实际递归执行中,递归会把根节点root等先压入递归栈底,即位于最底层的叶子节点,先被翻转,随着递归向上返回,上层的子树一个个被翻转,整个树就被翻转好了。
示例 2 的具体的执行流程如下:
示例 2:
输入: root = [2,1,3]
输出: [2,3,1]
- 第一轮,递归到底左子树,返回左侧
1节点,左右子树都为null, 交换后返回1 - 第二轮,递归到底右子树,返回右侧
2节点,左右子树都为null, 交换后返回2 - 第三轮,左右子树递归完毕,左右节点进行交换,
root.left = 2, root.left = 1, 完成交换。返回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) {
// root为空节点,不需要翻转,直接返回root;
if (root == null) return root;
// 得到左子树
let leftNode = invertTree(root.left);
// 得到右子树
let rightNode = invertTree(root.right);
// 左右子树交换,完成反转
root.left = rightNode;
root.right = leftNode;
// 最终返回root;
return root;
};