102. 二叉树的层序遍历
题目链接:力扣
思路:广度优先搜索(bfs)
# 使用列表模拟队列,pop(0),append()
class Solution:
def levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:
que = [] # 队列,存放暂时结点信息
res = [] # 结果,存放答案二维数组
if root != None:
que.append(root)
while que != []:
size = len(que)
curFloor = [] # 存放当前层的所有结点
for i in range(size):
node = que[0]
que.pop(0)
curFloor.append(node.val)
if node.left != None:
que.append(node.left)
if node.right != None:
que.append(node.right)
res.append(curFloor)
return res
226. 翻转二叉树
题目链接:力扣
思路:递归(深度优先搜索)
本质上就是二叉树的遍历,把输出根结点的语句换成swap左右结点。
注意中序遍历时的特殊处理。
class Solution:
def invertTree(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
def dfs(cur): # 确定返回值
if cur == None: # 确定终止条件
return None
cur.left, cur.right = cur.right, cur.left # 确定中间过程
dfs(cur.left)
dfs(cur.right)
dfs(root)
return root
# 中序遍历
class Solution:
def invertTree(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
def dfs(cur): # 确定返回值
if cur == None: # 确定终止条件
return None
dfs(cur.left) # 确定中间过程
cur.left, cur.right = cur.right, cur.left
dfs(cur.left) # 注意这里
dfs(root)
return root
226. 翻转二叉树
题目链接:力扣
思路:递归(深度优先搜索)
左子树和右子树如果可以像上一题那样相互翻转的话,那就是对称二叉树。
只能使用后序遍历,因为要先收集左右孩子的信息返回给上一个层结点处理。
分别递归比较左右孩子的外侧子树和内侧子树是否相等。
class Solution:
def isSymmetric(self, root: Optional[TreeNode]) -> bool:
def compare(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
# 排除了空节点,再排除数值不相同的情况
elif left.val != right.val: return False
outside = compare(left.left, right.right) # 左节点的左孩子和右节点的右孩子比较
inside = compare(left.right, right.left)
return outside and inside
return compare(root.left, root.right)