翻转二叉树
难度:
标签:
题目描述
给你一棵二叉树的根节点 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
代码结果
运行时间: 44 ms, 内存: 14.9 MB
/*
* 思路:使用 Java Stream API 进行树的遍历和翻转
* 1. 由于 Stream API 适用于集合,而树结构本质上是非线性的,直接使用 Stream API 有一定难度
* 2. 可以通过将树节点放入 List 或 Queue 中,再使用 Stream 操作进行反转
* 3. 此示例中我们依旧采用递归的方法来实现树的反转
*/
import java.util.stream.Stream;
public class Solution {
public TreeNode invertTree(TreeNode root) {
if (root == null) {
return null;
}
TreeNode left = invertTree(root.left);
TreeNode right = invertTree(root.right);
root.left = right;
root.right = left;
return root;
}
}
/* 定义二叉树节点类 TreeNode */
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
解释
方法:
该题解使用深度优先搜索(DFS)的方式遍历二叉树的每个节点。对于每个遍历到的节点,交换其左右子树,然后递归地对其左右子树分别执行相同的翻转操作。通过这种方式,可以实现对整棵二叉树的翻转。
时间复杂度:
O(n)
空间复杂度:
O(n)
代码细节讲解
🦆
在递归函数中,为什么首先进行节点的左右子树交换,而不是先递归子树再交换?这种顺序对结果有何影响?
▷🦆
递归函数中对于空节点直接返回的处理方式是否意味着对空树不进行任何操作就是最优的处理策略?
▷🦆
在递归过程中,如果在某个节点发现它的左右子树已经是对称的,是否有必要继续执行翻转操作?这会影响算法的执行效率吗?
▷