102. 二叉树的层序遍历
- 单调队列
def levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:
if not root:
return []
queue = [root]
res = []
while queue:
n = len(queue)
tmp = []
while n:
node = queue.pop(0)
if node:
tmp.append(node.val)
if node.left:
queue.append(node.left)
if node.right:
queue.append(node.right)
n -= 1
res.append(tmp)
return res
- 递归
def traversal(node, d):
if not node:
return
if len(res) == d:
res.append([])
res[d].append(node.val)
traversal(node.left, d+1)
traversal(node.right, d+1)
相关:
107. 二叉树的层序遍历 II
return res[::-1]
199. 二叉树的右视图
def rightSideView(self, root: Optional[TreeNode]) -> List[int]:
if not root:
return []
queue = [root]
res = []
while queue:
n = len(queue)
tmp = []
while n:
node = queue.pop(0)
if node:
tmp.append(node.val)
if node.left:
queue.append(node.left)
if node.right:
queue.append(node.right)
n -= 1
res.append(tmp[-1])
return res
637. 二叉树的层平均值
def averageOfLevels(self, root: Optional[TreeNode]) -> List[float]:
if not root:
return []
queue = [root]
res = []
while queue:
n = len(queue)
i = n
ave = 0
while n:
node = queue.pop(0)
if node:
ave += node.val
if node.left:
queue.append(node.left)
if node.right:
queue.append(node.right)
n -= 1
res.append(ave/i)
return res
429. N 叉树的层序遍历
def levelOrder(self, root: 'Node') -> List[List[int]]:
if not root:
return []
queue = [root]
res = []
while queue:
n = len(queue)
tmp = []
while n:
node = queue.pop(0)
if node:
tmp.append(node.val)
if node.children:
for child in node.children:
queue.append(child)
n -= 1
res.append(tmp)
return res
515. 在每个树行中找最大值
def largestValues(self, root: Optional[TreeNode]) -> List[int]:
if not root:
return []
queue = [root]
res = []
while queue:
n = len(queue)
tmp = []
maximum = - inf
while n:
node = queue.pop(0)
if node:
maximum = max(maximum, node.val)
if node.left:
queue.append(node.left)
if node.right:
queue.append(node.right)
n -= 1
res.append(maximum)
return res
116. 填充每个节点的下一个右侧节点指针
&
117. 填充每个节点的下一个右侧节点指针 II
def connect(self, root: 'Optional[Node]') -> 'Optional[Node]':
if not root:
return root
queue = [root]
res = []
while queue:
n = len(queue)
tmp = []
for i in range(n):
node = queue.pop(0)
if node:
tmp.append(node.val)
if node.left:
queue.append(node.left)
if node.right:
queue.append(node.right)
if i == n - 1:
break
node.next = queue[0]
res.append(tmp)
return root
深度问题
104. 二叉树的最大深度
def maxDepth(self, root: Optional[TreeNode]) -> int:
if not root:
return 0
queue = [root]
depth = 0
while queue:
n = len(queue)
tmp = []
while n:
node = queue.pop(0)
if node:
tmp.append(node.val)
if node.left:
queue.append(node.left)
if node.right:
queue.append(node.right)
n -= 1
depth += 1
return depth
最小深度
#根节点的深度为1
queue_ = [(root,1)]
while queue_:
cur, depth = queue_.pop(0)
if cur.left == None and cur.right == None:
return depth
#先左子节点,由于左子节点没有孩子,则就是这一层了
if cur.left:
queue_.append((cur.left,depth + 1))
if cur.right:
queue_.append((cur.right,depth + 1))
return 0
226. 翻转二叉树
- 迭代法
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
def invertTree(self, root: TreeNode) -> TreeNode:
# 后序遍历
if root is None:
return None
self.invertTree(root.left)
self.invertTree(root.right)
root.left, root.right = root.right, root.left
return root
101. 对称二叉树
判断左右子树是否相等