Leetcode原题链接:
翻转二叉树
一、思路
- 说是翻转,其实还是遍历,用之前几次的递归、迭代、层序遍历方法都可以实现,边遍历边交换左右孩子即可。
二、代码
1、迭代遍历
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def invertTree(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
if not root:
return root
queue = [root]
while queue:
node = queue.pop(0)
if node.left:
queue.append(node.left)
if node.right:
queue.append(node.right)
node.left, node.right = node.right, node.left
return root
- 虽然这是迭代遍历,但是刚开始我还以为自己写的是层序遍历。。
2、层序遍历
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def invertTree(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
if not root:
return root
queue = [root]
while queue:
for i in range(len(queue)):
node = queue.pop(0)
node.left, node.right = node.right, node.left
if node.left:
queue.append(node.left)
if node.right:
queue.append(node.right)
return root
- 正经的层序遍历,通过
for
循环控制每一层,按照每一层来遍历的。
3、递归遍历
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def invertTree(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
if not root:
return root
root.left, root.right = root.right, root.left
self.invertTree(root.left)
self.invertTree(root.right)
return root
- 递归三部曲:确定参数和返回值、确定终止条件、确定单层逻辑
三、总结
- 还是要熟悉下递归三部曲
- 迭代和层序要区分开,个人认为记住一个重要的点就是层序遍历按照层来遍历,因此需要用
for
循环控制当前层
部分内容参考代码随想录