题目
翻转一棵二叉树。简单来说就是将二叉树每一个节点的左右子节点进行交换。
示例
input:
4
/ \
2 7
/ \ / \
1 3 6 9
output:
4
/ \
7 2
/ \ / \
9 6 3 1
解法
深度优先遍历-递归实现( Python )
class Solution:
def invertTree(self, root: TreeNode) -> TreeNode:
if(root == None):
return None
tmp = root.left
root.left = root.right
root.right = tmp
self.invertTree(root.left)
self.invertTree(root.right)
return root
基本思路
采用自上而下的深度优先遍历方式,先处理root == None
的基准情形,然后对当前节点的左右节点进行交换。交换结束之后,再分别递归翻转左右子树。
复杂度分析
时间上因为要访问每一个节点,对其左右子节点进行翻转,所以复杂度为 O ( N ) O \left( N \right) O(N)。空间上因为使用递归,最糟糕情况为 O ( N ) O \left( N \right) O(N),平均情况为 O ( l o g N ) O\left( logN \right) O(logN)。
广度优先遍历-迭代实现( Python )
class Solution:
def invertTree(self, root: TreeNode) -> TreeNode:
if(root == None):
return None
n_queue = [root]
while(n_queue != []):
node = n_queue.pop(0)
tmp = node.left
node.left = node.right
node.right = tmp
if node.left:
n_queue.append(node.left)
if node.right:
n_queue.append(node.right)
return root
基本思路
每访问一个节点,先翻转这个节点的左右子节点,然后将不为None
的左右子节点压入队列,直至访问完所有节点。
复杂度分析
时间上也是要访问所有节点,所以时间复杂度为 O ( N ) O \left( N \right) O(N)。空间上,极端情况是只有根节点,则所有节点都在队列里,复杂度为 O ( N ) O\left( N \right) O(N)。对于满二叉树,所需队列的长度等于节点最多的一层的节点数,那么复杂度为 O ( ⌈ N 2 ⌉ ) O \left( \lceil \frac{N}{2} \rceil \right) O(⌈2N⌉)。