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

2020-08-07  本文已影响0人  9_SooHyun

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)

上一篇下一篇

猜你喜欢

热点阅读