226.翻转二叉树
题目:
翻转一棵二叉树。
示例:
输入:
4
/ \
2 7
/ \ / \
1 3 6 9
输出:
4
/ \
7 2
/ \ / \
9 6 3 1
思路:递归 迭代
递归:
方法一:
先序遍历。在进入递归左子树之前,先处理节点值。具体的做法如下:
- 确定终止条件:当前节点为空,返回;
- 先处理节点值,也就是先交换节点的左右子树;
- 然后进入递归,进行翻转。
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def invertTree(self, root: TreeNode) -> TreeNode:
if not root:
return root
# 先从根节点
root.left, root.right = root.right, root.left
self.invertTree(root.right)
self.invertTree(root.left)
return root
方法二:
后序遍历,在递归完右子树之后,处理节点值。具体的做法如下:
- 确定终止条件:当 root 为空时,直接返回;
- 从根节点开始,进行递归遍历,找到叶子节点;
- 交换叶子节点,然后向上返回,继续翻转。
class Solution:
def invertTree(self, root: TreeNode) -> TreeNode:
if not root:
return
# 先进入递归,找到叶子结点
self.invertTree(root.left)
self.invertTree(root.right)
# 递归完右子树之后,处理节点值
root.left, root.right = root.right, root.left
return root
迭代<层序遍历>
- 处理特殊情况,若 root 为空,返回 root,否则继续下一步;
- 声明辅助队列,先将 root 入队列;
- 队列非空时,节点出队,交换节点的左右子树;
- 若当前节点还存在左右子节点,将左右子节点入队,后续继续交换。
- 循环直至队列为空。
# 转载
class Solution:
def invertTree(self, root: TreeNode) -> TreeNode:
# 特殊处理
if not root:
return root
from collections import deque
# 辅助队列,先将根节点入队
queue = deque()
queue.append(root)
while queue:
# 出队,交换左右子树
node = queue.popleft()
node.left, node.right = node.right, node.left
# 若当前节点存在左右子节点,
# 入队,后续继续交换
if node.left:
queue.append(node.left)
if node.right:
queue.append(node.right)
return root
作者:yiluolion
链接:https://leetcode-cn.com/problems/invert-binary-tree/solution/226-fan-zhuan-er-cha-shu-di-gui-die-dai-by-yiluoli/
来源:力扣(LeetCode)