翻转二叉树的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)