题目
给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。
示例 1:
输入:root = [4,2,7,1,3,6,9]
输出:[4,7,2,9,6,3,1]
示例 2:
输入:root = [2,1,3]
输出:[2,3,1]
示例 3:
输入:root = []
输出:[]
提示:
树中节点数目范围在 [0, 100] 内
-100 <= Node.val <= 100
思路
整体思想是利用遍历过程,在遍历时将每个节点的左右元素进行交换。所以可以用三种递归遍历和非递归方式进行遍历。但是这里要注意中序递归遍历会有点问题,尽量用前序和后序遍历吧。
递归前序遍历
# 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]:
def solve(root):
if not root:
return
root.left, root.right = root.right, root.left
solve(root.left)
solve(root.right)
solve(root)
return root
递归后序遍历
# 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]:
def solve(root):
if not root:
return
solve(root.left)
solve(root.right)
root.left, root.right = root.right, root.left
solve(root)
return root
非递归前序遍历
# 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
def solve(root):
stack = [root]
while stack:
now = stack.pop()
now.left, now.right = now.right, now.left
if now.right:
stack.append(now.right)
if now.left:
stack.append(now.left)
solve(root)
return root
非递归后续遍历
# 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
def solve(root):
stack = [root]
while stack:
now = stack.pop()
if now.left:
stack.append(now.left)
if now.right:
stack.append(now.right)
now.left, now.right = now.right, now.left
solve(root)
return root
补充一下层序遍历代码:
# 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
def solve(root):
q = deque([root])
while q:
now = q.popleft()
if now.left:
q.append(now.left)
if now.right:
q.append(now.right)
now.left, now.right = now.right, now.left
solve(root)
return root