携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第8天,点击查看活动详情
一、题目描述:
226. 翻转二叉树 - 力扣(LeetCode) (leetcode-cn.com)
给你一棵二叉树的根节点 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
二、思路分析:
- 两种思路,一种是递归,一种是遍历
- 对于遍历思维
- 使用 traverse 函数,在遍历每一个节点时,让左右子树做交换即可。
- 交换的位置:可以在前中后序均可。但是需要注意的是,在中序遍历位置时,要注意左子树换到了右子树的位置上,这时候再对右子树进行翻转,就相当于对原来的左子树进行第二次反转了。
- 对于分解问题思想
- 那么 invertTree 函数的定义是将以 root 为根的这棵二叉树翻转,返回翻转后的二叉树的根节点
- 在递归调用后,要对函数节点进行翻转。
三、AC 代码:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public TreeNode invertTree(TreeNode root) {
if (root == null) {
return null;
}
traverse(root);
return root;
}
public void traverse(TreeNode root) {
if (root == null) {
return;
}
// 在前序遍历位置翻转
TreeNode temp = root.left;
root.left = root.right;
root.right = temp;
traverse(root.left);
traverse(root.right);
// // 在后序遍历位置进行翻转
// TreeNode temp = root.left;
// root.left = root.right;
// root.right = temp;
}
}
class Solution {
public TreeNode invertTree(TreeNode root) {
// base case
if (root == null) {
return null;
}
// 递归调用
TreeNode leftTree = invertTree(root.left);
TreeNode rightTree = invertTree(root.right);
// 当前节点进行翻转
root.left = rightTree;
root.right = leftTree;
return root;
}
}