迭代法
from collections import deque
class Solution:
def levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:
if root == None:
return []
queue = deque()
queue.append(root)
res = []
while queue:
length = len(queue)
level = []
for _ in range(length):
cur = queue.popleft()
level.append(cur.val)
if cur.left:
queue.append(cur.left)
if cur.right:
queue.append(cur.right)
res.append(level)
return res
递归法
class Solution:
def levelOrder(self, root):
"""
:type root: TreeNode
:rtype: List[List[int]]
"""
levels = []
if not root:
return levels
def helper(node, level):
if len(levels) == level:
levels.append([])
levels[level].append(node.val)
if node.left:
helper(node.left, level + 1)
if node.right:
helper(node.right, level + 1)
helper(root, 0)
return levels
class Solution:
def levelOrderBottom(self, root: Optional[TreeNode]) -> List[List[int]]:
if root == None:
return []
res = []
q = deque([root])
while q:
l = len(q)
level = []
for _ in range(l):
cur = q.popleft()
level.append(cur.val)
if cur.left:
q.append(cur.left)
if cur.right:
q.append(cur.right)
res.append(level)
return res[::-1]
- 队列中存储每层的所有nodes,res中只记录每层的最后一个node
class Solution:
def rightSideView(self, root: Optional[TreeNode]) -> List[int]:
if root == None:
return []
res = []
q = deque([root])
while q:
l = len(q)
cur = q[-1]
res.append(cur.val)
for _ in range(l):
cur = q.popleft()
if cur.left:
q.append(cur.left)
if cur.right:
q.append(cur.right)
return res
class Solution:
def averageOfLevels(self, root: Optional[TreeNode]) -> List[float]:
if root == None:
return []
q = deque([root])
res = []
while q:
l = len(q)
s = 0
for _ in range(l):
cur = q.popleft()
s += cur.val
if cur.left:
q.append(cur.left)
if cur.right:
q.append(cur.right)
res.append(s/l)
return res
class Solution:
def levelOrder(self, root: 'Node') -> List[List[int]]:
if root == None:
return []
q = deque([root])
res = []
while q:
l = len(q)
level = []
for _ in range(l):
cur = q.popleft()
level.append(cur.val)
for child in cur.children:
q.append(child)
res.append(level)
return res
class Solution:
def largestValues(self, root: Optional[TreeNode]) -> List[int]:
if root == None:
return []
q = deque([root])
res = []
while q:
l = len(q)
max_val = float('-inf')
for _ in range(l):
cur = q.popleft()
max_val = cur.val if cur.val > max_val else max_val
if cur.left:
q.append(cur.left)
if cur.right:
q.append(cur.right)
res.append(max_val)
return res
- BFS
- 每次弹出一个node,将next指向新的队列头
class Solution:
def connect(self, root: 'Node') -> 'Node':
if not root:
return None
queue = deque([root])
while queue:
n = len(queue)
for i in range(n):
node = queue.popleft()
if node.left:
queue.append(node.left)
if node.right:
queue.append(node.right)
if i == n - 1:
break
node.next = queue[0]
return root
class Solution:
def connect(self, root: 'Node') -> 'Node':
if not root:
return None
queue = deque([root])
while queue:
n = len(queue)
for i in range(n):
node = queue.popleft()
if node.left:
queue.append(node.left)
if node.right:
queue.append(node.right)
if i == n - 1:
break
node.next = queue[0]
return root
class Solution:
def maxDepth(self, root: Optional[TreeNode]) -> int:
if not root:
return 0
q = deque([root])
depth = 0
while q:
l = len(q)
for _ in range(l):
cur = q.popleft()
if cur.left:
q.append(cur.left)
if cur.right:
q.append(cur.right)
depth += 1
return depth
class Solution:
def minDepth(self, root: Optional[TreeNode]) -> int:
if not root:
return 0
q = deque([root])
depth = 0
while q:
l = len(q)
depth += 1
for _ in range(l):
cur = q.popleft()
if not cur.left and not cur.right:
return depth
if cur.left:
q.append(cur.left)
if cur.right:
q.append(cur.right)
return depth
递归法:前序遍历
class Solution:
def invertTree(self, root: TreeNode) -> TreeNode:
if not root:
return None
root.left, root.right = root.right, root.left
self.invertTree(root.left)
self.invertTree(root.right)
return root
迭代法:前序遍历
class Solution:
def invertTree(self, root: TreeNode) -> TreeNode:
if not root:
return None
stack = deque([root])
while stack:
cur = stack.pop()
cur.left, cur.right = cur.right, cur.left
if cur.right:
stack.append(cur.right)
if cur.left:
stack.append(cur.left)
return root
迭代法:层序遍历
class Solution:
def invertTree(self, root: TreeNode) -> TreeNode:
if not root:
return None
q = deque([root])
while q:
cur = q.popleft()
cur.left, cur.right = cur.right, cur.left
if cur.left:
q.append(cur.left)
if cur.right:
q.append(cur.right)
return root
递归法
class Solution:
def isSymmetric(self, root: Optional[TreeNode]) -> bool:
if not root:
return True
return self.helper(root.left, root.right)
def helper(self, left, right):
if left == None and right != None:
return False
elif left != None and right == None:
return False
elif left == None and right == None:
return True
if left.val != right.val:
return False
outside = self.helper(left.left, right.right)
inside = self.helper(left.right, right.left)
is_same = outside and inside
return is_same
迭代法:使用队列
class Solution:
def isSymmetric(self, root: Optional[TreeNode]) -> bool:
if not root:
return True
queue = deque()
queue.append(root.left)
queue.append(root.right)
while queue:
leftNode = queue.popleft()
rightNode = queue.popleft()
if not leftNode and not rightNode:
continue
if not leftNode or not rightNode or leftNode.val != rightNode.val:
return False
queue.append(leftNode.left)
queue.append(rightNode.right)
queue.append(leftNode.right)
queue.append(rightNode.left)
return True