Leetcode 226.翻转二叉树

26. 翻转二叉树

题目

翻转一棵二叉树。

示例:

输入:

1
2
3
4
5
6
7
8
9
10
11
12
     4
/ \
2 7
/ \ / \
1 3 6 9
输出:

4
/ \
7 2
/ \ / \
9 6 3 1

备注:
这个问题是受到 Max Howell 的 原问题 启发的 :
谷歌:我们90%的工程师使用您编写的软件(Homebrew),但是您却无法在面试时在白板上写出翻转二叉树这道题,这太糟糕了。

方法

方法1:递归

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None

class Solution(object):
def invertTree(self, root):
"""
:type root: TreeNode
:rtype: TreeNode
"""
# 先序遍历
# if not root:
# return
#
# root.left,root.right=root.right,root.left
# self.invertTree(root.left)
# self.invertTree(root.right)
# return root

# 后序遍历
if not root:
return

self.invertTree(root.left)
self.invertTree(root.right)
root.left,root.right=root.right,root.left
return root

方法2:迭代

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None

class Solution(object):
def invertTree(self, root):
"""
:type root: TreeNode
:rtype: TreeNode
"""
if not root:
return
stack=[root]
while stack:
node=stack.pop()
if not node:
continue

node.left,node.right=node.right,node.left
if node.left:
stack.append(node.left)
if node.right:
stack.append(node.right)
return root
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None

class Solution(object):
def invertTree(self, root):
"""
:type root: TreeNode
:rtype: TreeNode
"""
stack=[]
ans=root
while root or stack:
while root:
root.left,root.right=root.right,root.left
stack.append(root.right)
root=root.left
root=stack.pop()
return ans