力扣刷题笔记:剑指 Offer 27. 二叉树的镜像(利用临时列表遍历树的所有节点 node ,并交换每个 node 的左 / 右子节点。)

题目:

剑指 Offer 27、二叉树的镜像

请完成一个函数,输入一个二叉树,该函数输出它的镜像。

例如输入:
力扣刷题笔记:剑指 Offer 27. 二叉树的镜像(利用临时列表遍历树的所有节点 node ,并交换每个 node 的左 / 右子节点。)_第1张图片

镜像输出:
力扣刷题笔记:剑指 Offer 27. 二叉树的镜像(利用临时列表遍历树的所有节点 node ,并交换每个 node 的左 / 右子节点。)_第2张图片

示例 1:

输入:root = [4,2,7,1,3,6,9]
输出:[4,7,2,9,6,3,1]

限制:

0 <= 节点个数 <= 1000

题解思路:

利用栈(或队列)遍历树的所有节点 node ,并交换每个 node 的左 / 右子节点。

算法流程:
特例处理: 当 root 为空时,直接返回 null;
初始化: 栈(或队列),本文用栈,并加入根节点 root 。
循环交换: 当栈 stack 为空时跳出;
出栈: 记为 node ;
添加子节点: 将 node 左和右子节点入栈;
交换: 交换 node 的左 / 右子节点。
返回值: 返回根节点 root 。

复杂度分析:
时间复杂度 O(N) : 其中 N 为二叉树的节点数量,建立二叉树镜像需要遍历树的所有节点,占用 O(N) 时间。
空间复杂度 O(N) : 最差情况下(当为满二叉树时),栈 stack 最多同时存储 N/2 个节点,占用 O(N) 额外空间。

题解python代码:

class Solution:
    def mirrorTree(self, root: TreeNode) -> TreeNode:
        if not root:
            return
        s = [root]
        while s:
            node = s.pop()
            if node.left:
                s.append(node.left)
            if node.right:
                s.append(node.right)
            node.left, node.right = node.right, node.left
        return root

力扣刷题笔记:剑指 Offer 27. 二叉树的镜像(利用临时列表遍历树的所有节点 node ,并交换每个 node 的左 / 右子节点。)_第3张图片

作者:jyd
链接:https://leetcode-cn.com/problems/er-cha-shu-de-jing-xiang-lcof/solution/mian-shi-ti-27-er-cha-shu-de-jing-xiang-di-gui-fu-/
来源:力扣(LeetCode)https://leetcode-cn.com/problems/er-cha-shu-de-jing-xiang-lcof/

你可能感兴趣的:(刷题笔记,leetcode,python)