102. Binary Tree Level Order Traversal
Given the root
of a binary tree, return the level order traversal of its nodes' values. (i.e., from left to right, level by level.
层序遍历。按层从上到下从左到右输出二叉树的值。注意,输出格式每层为一个list。
递归法:
class Solution:
def levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:
levels = []
self.helper(root, 0, levels)
return levels
def helper(self, node, level, levels):
if not node:
return
if len(levels) == level:
levels.append([])
levels[level].append(node.val)
self.helper(node.left, level+1, levels)
self.helper(node.right, level+1, levels)
迭代法:
class Solution:
def levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:
if not root:
return []
queue = collections.deque([root])
result = []
while queue:
level = []
for i in range(len(queue)):
cur = queue.popleft()
level.append(cur.val)
if cur.left:
queue.append(cur.left)
if cur.right:
queue.append(cur.right)
result.append(level)
return result
算法和时间复杂度都为O(N)。因为每个节点都要被遍历到,所以时间是O(N)。队列在最坏的情况下,也就是完全二叉树,队列包含树的最后一层的节点时,达到队列长度的最大值,即至多(N/2)+1个节点,所以空间复杂度是O(N)。但有时树的宽度也可以较窄。
226. Invert Binary Tree
# 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 None
root.left, root.right = root.right, root.left
self.invertTree(root.right)
self.invertTree(root.left)
return root
101. Symmetric Tree
Given the root
of a binary tree, check whether it is a mirror of itself (i.e., symmetric around its center).
class Solution:
def isSymmetric(self, root: Optional[TreeNode]) -> bool:
if not root:
return True
return self.isSame(root.left, root.right)
def isSame(self, leftroot, rightroot):
if leftroot == None and rightroot == None:
return True
if leftroot == None or rightroot == None:
return False
if leftroot.val != rightroot.val:
return False
return self.isSame(leftroot.left, rightroot.right) and self.isSame(leftroot.right, rightroot.left)