美文网首页
翻转二叉树的2种角度3种方法 2020-08-07 (未允禁转)

翻转二叉树的2种角度3种方法 2020-08-07 (未允禁转)

作者: 9_SooHyun | 来源:发表于2020-08-07 11:04 被阅读0次

    2种角度,指【宏观角度】和【微观角度】

    宏观角度-递归

    因为树自身就是递归定义的,很多树相关的问题都可以借助递归思想来解决,而无需关心每一步的细节

    翻转一棵树 =【交换根节点的左右子树】+【翻转左子树】+【翻转右子树】
    等式两边都出现了翻转树的操作,也就形成了递归式

    class Solution:
        def mirrorTree(self, root: TreeNode) -> TreeNode:
            if not root:
                return
            temp = root.left
            root.left = root.right
            root.right = temp
            self.mirrorTree(root.left)
            self.mirrorTree(root.right)
            return root
    

    微观视角-非递归实现

    深入到每个节点上看,【翻转一棵树 = 翻转每个节点的左右孩子】。那么我们遍历所有节点,然后对遍历到的节点,交换它的左右孩子

    遍历树的方式无外乎两种,DFS和BFS

    DFS版代码:

    class Solution:
        def mirrorTree(self, root: TreeNode) -> TreeNode:
            # 使用栈来实现深度优先遍历的翻转
            layer = []
            layer.append(root)
            while layer:
                p = layer.pop()
                if p:
                    temp = p.left
                    p.left = p.right
                    p.right = temp
                    layer.append(p.left)
                    layer.append(p.right)
            return root
    

    BFS版代码:

    class Solution:
        def mirrorTree(self, root: TreeNode) -> TreeNode:
            # 使用层次遍历实现翻转
            layer = []
            layer.append(root)
            while layer:
                p = layer.pop(0)
                if p:
                    temp = p.left
                    p.left = p.right
                    p.right = temp
                    layer.append(p.left)
                    layer.append(p.right)
            return root
    

    注意,上面2种遍历方式的代码差异只有一处,layer.pop()和layer.pop(0)

    相关文章

      网友评论

          本文标题:翻转二叉树的2种角度3种方法 2020-08-07 (未允禁转)

          本文链接:https://www.haomeiwen.com/subject/qrqfdktx.html