翻转二叉树

导语:

        有一个让程序员心酸的故事,听说 Homebrew的作者Max Howell,就是因为没在白板上写出翻转二叉树,最后被Google拒绝了。

        二叉树是一种非常基础且重要的数据结构,而翻转二叉树是二叉树类题目中非常经典的一道。虽然简单,但是可以很好的检验大家的算法基础。翻转二叉树的详情如下,即将左边的二叉树翻转为右边的结构:

  

一.思路

         二叉树的遍历方式分为广度优先遍历和深度优先遍历,这里我们可以采用广度优先搜索(BFS)的方式来遍历整棵树,并且通过在每次遍历时,交换每个节点的左右子节点,进而实现翻转。

二.代码

        根据以上思路,代码如下

class Solution:
    def invertTree(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
        # 如果根节点为空,直接返回空
        if root is None:
            return None

        # 创建一个双向队列,并将根节点作为初始元素添加到队列中
        queue = collections.deque([root])

        # 当队列不为空时,继续进行翻转操作
        while len(queue) > 0:
            # 从队列的左侧取出当前节点
            cur_node = queue.popleft()

            # 如果当前节点不为空
            if cur_node is not None:
                # 交换当前节点的左右子节点
                cur_node.left, cur_node.right = cur_node.right, cur_node.left

                # 将交换后的左右子节点添加到队列中,以便后续继续翻转它们的子节点
                queue.append(cur_node.left)
                queue.append(cur_node.right)

        # 返回翻转后的根节点
        return root

三.递归法实现翻转二叉树

        以上是迭代法实现二叉树翻转的代码,除此之外,使用递归的方法也可以实现翻转二叉树的功能,代码如下

class Solution:
    def invertTree(self, root: TreeNode) -> TreeNode:
        # 如果根节点为空,直接返回空
        if not root:
            return None
        
        # 递归调用,翻转左子树
        self.invertTree(root.left)
        
        # 递归调用,翻转右子树
        self.invertTree(root.right)
        
        # 交换当前节点的左右子节点
        root.left, root.right = root.right, root.left
        
        # 返回翻转后的根节点
        return root

        由于实现二叉树翻转相对简单,所以有很多种方法都可以实现,同学们可以仔细比较迭代法和递归法的区别,以及分别使用前序遍历,中序遍历,后续遍历的方法实现二叉树的翻转,这里就不多介绍了。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Master_清欢

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值