上下翻转二叉树
难度:
标签:
题目描述
代码结果
运行时间: 20 ms, 内存: 16.7 MB
// 题目思路:使用递归并结合Java Stream API进行翻转。此题目不太适合使用纯Stream API实现,但可以结合递归实现。
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
import java.util.stream.Stream;
public class Solution {
public TreeNode invertTree(TreeNode root) {
if (root == null) {
return null;
}
// 使用Stream API交换左右子节点
Stream.of(root.left, root.right).reduce((left, right) -> {
root.left = right;
root.right = left;
return null;
});
// 递归地翻转左子树和右子树
invertTree(root.left);
invertTree(root.right);
return root;
}
}
解释
方法:
这个题解采用了迭代的方式来翻转二叉树。通过将每个节点的左右子树进行交换,并同时记录该节点的父节点和原右子树,就可以实现二叉树的上下翻转。具体来说,使用 parent 变量记录当前节点的父节点,right 变量暂存当前节点的右子树,然后将当前节点的左子树赋给 root.left,右子树赋为 parent,最后更新 parent 为当前节点,并将 root 指向原左子节点,进入下一次迭代。当 root 为空时,新的树根就是 parent。
时间复杂度:
O(n)
空间复杂度:
O(1)
代码细节讲解
🦆
迭代方法中,为什么选择在遍历时仅通过左子节点向下进行,而不是同时考虑右子节点?
▷🦆
在迭代过程中,如何确保不会丢失对原始二叉树的右子树的引用,特别是在多次迭代中?
▷🦆
题解中提到的 `parent` 和 `right` 变量在算法中分别起到了什么作用?请解释它们在翻转过程中的具体用途。
▷🦆
你如何处理原始树根节点的左右子树,在树完全翻转后它们的指向关系是如何的?
▷