leetcode
leetcode 2551 ~ 2600
翻转二叉树

翻转二叉树

难度:

标签:

题目描述

English description is not available for the problem. Please switch to Chinese.

代码结果

运行时间: 56 ms, 内存: 14.8 MB


/*
 * 思路:使用Java Stream API来实现翻转二叉树相对复杂,因为Stream更适合处理集合和数组。
 * 这里我们仍然使用递归的思路,但展示如何用Stream API进行节点值的处理。
 */

import java.util.stream.Stream;

class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;
    TreeNode(int x) { val = x; }
}

public class Solution {
    public TreeNode invertTree(TreeNode root) {
        if (root == null) {
            return null;
        }
        // 使用Stream处理节点值
        Stream.of(root.left, root.right).forEach(node -> invertTree(node));
        // 交换左子节点和右子节点
        TreeNode temp = root.left;
        root.left = root.right;
        root.right = temp;
        return root;
    }
}

解释

方法:

该题解采用递归的方式进行二叉树的翻转。对于每一个节点,首先递归地翻转其右子树,然后递归地翻转其左子树。完成这两个步骤后,交换当前节点的左右子节点。这个过程会递归地应用到每一个非空节点,直到所有的节点都被访问并翻转其左右子树。

时间复杂度:

O(n)

空间复杂度:

O(h) where h is the height of the tree, worst case O(n)

代码细节讲解

🦆
在递归时,为什么首先翻转右子树,再翻转左子树,最后交换左右子树的顺序,这种顺序是否会影响最终的结果?
在递归翻转二叉树的过程中,首先翻转右子树再翻转左子树的顺序实际上并不会影响最终的结果。无论是先翻转右子树还是左子树,最终的操作是将两者的位置进行交换。因此,这种顺序只是递归实现的一种选择,并没有特定的逻辑或性能上的优势。可以根据个人习惯或者特定需求来调整递归的顺序。
🦆
递归解法中,如果树的结构非常不平衡,比如所有节点都只有左子树或右子树,递归栈的深度将如何影响算法的性能?
如果二叉树的结构非常不平衡,例如所有节点都只有左子树或右子树,这将导致递归的深度等于树的高度,即递归栈的最大深度也等于树的高度。这种情况下,递归解法的时间和空间复杂度都将受到影响。时间复杂度依然是O(n),因为每个节点仍然只访问一次。但是,空间复杂度在最坏情况下会达到O(n),因为递归栈的深度最大可能与节点数相同。这可能导致在极端情况下性能问题或栈溢出。
🦆
递归过程中,为什么需要判断节点是否为空?这一步骤在算法中起到了什么作用?
在递归过程中判断节点是否为空是必须的,因为这是递归终止的条件之一。如果不进行这样的判断,当递归到叶子节点的子节点(即null)时,程序将尝试访问空引用,从而导致错误。此外,这一步骤确保了只有非空节点会被处理和交换,保证了算法的正确性和稳定性。
🦆
翻转二叉树后,原有的二叉树结构是否被完全覆盖,还是说原树的结构仍然可以从结果中恢复?
翻转二叉树的操作会改变树中每个节点的左右子节点的位置,因此原有的二叉树结构被完全覆盖。但是,这个操作是可逆的。如果对翻转后的树再次执行相同的翻转操作,可以恢复到原树的结构。因此,尽管原结构被覆盖,但可以通过相同的翻转操作来恢复。

相关问题