102.二叉树的层序遍历
class Solution:
def levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:
if not root:
return []
queue = collections.deque([root])
result = []
while queue:
level = []
for _ 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
回答:这个len queue 可以确定每层的节点个数,举个例子,一开始压入根节点,目前len queue 是1,然后for 循环内判断该节点是否有左右节点,假设都有,下次len queue 就是2了。假设没有,len queue 就是0了,以此类推
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([]) (if语句和这句是什么意思)
levels[level].append(node.val)
self.helper(node.left, level + 1, levels)
self.helper(node.right, level + 1, levels)
回答:这是因为只要不是空节点,就需要是列表套列表哇,比如样例2,输入:root = [1]
输出:[[1]]
226.翻转二叉树
初步想法:交换每个节点的左右子树, 直接用left,right=right,left
二叉树的遍历是基础,递归遍历,迭代遍历(用stack),层序遍历(用queue)
101. 对称二叉树
初步想法:
1、就是判断根节点的左右子树是否可以翻转(遍历左右子树,得到result1和result2,result1=reversed(result2))
题解:运用层序遍历只得到一个level_val的列表,判断条件 level_val==level_val【::-1】
lass Solution:
def isSymmetric(self, root: TreeNode) -> bool:
if not root:
return True
queue = collections.deque([root.left, root.right])
while queue:
level_size = len(queue)
if level_size % 2 != 0:
return False
level_vals = []
for i in range(level_size):
node = queue.popleft()
if node:
level_vals.append(node.val)
queue.append(node.left)
queue.append(node.right)
else:
level_vals.append(None)
if level_vals != level_vals[::-1]:
return False
return True
2、判断外侧节点是否相等,内侧节点是否相等
遍历只能采用后序遍历(左右中)只有这样才能把左右节点的信息返回给中节点
问题:
利用双端队列,左子树从前出,右子树从后出 再相互比较,为什么会出错?
572 572. 另一棵树的子树
问题:为什么结果相反?