代码随想训练营第十四天(Python)| 层序遍历 10 、● 226.翻转二叉树 、101.对称二叉树 2
层序遍历
1、迭代法,使用队列
class Solution:
def levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:
res = []
if root is None:
return res
queue = [root]
while queue:
n = len(queue)
tmp = []
for i in range(n):
node = queue.pop(0)
tmp.append(node.val)
if node.left:
queue.append(node.left)
if node.right:
queue.append(node.right)
res.append(tmp)
return res
2、递归
class Solution:
def levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:
levels = []
if root is None:
return levels
self.helper(root, 0, levels)
return levels
def helper(self, node, level, levels):
if not node:
return
if level == len(levels):
levels.append([])
levels[level].append(node.val)
self.helper(node.left, level+1, levels)
self.helper(node.right, level+1, levels)
226.翻转二叉树
1、递归前序遍历
class Solution:
def invertTree(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
if root is None:
return root
root.left, root.right = root.right, root.left
self.invertTree(root.left)
self.invertTree(root.right)
return root
2、前序遍历的统一写法
class Solution:
def invertTree(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
stack = []
if root:
stack.append(root)
while stack:
node = stack.pop()
if node:
if node.right:
stack.append(node.right) # 右
if node.left:
stack.append(node.left) # 左
# 需要处理的节点
stack.append(node) # 中
stack.append(None) # 作标记
else:
# 处理节点
node = stack.pop()
node.left, node.right = node.right, node.left
return root
101.对称二叉树 2
1、递归法
class Solution:
def isSymmetric(self, root: Optional[TreeNode]) -> bool:
if root is None:
return True
return self.compare(root.left, root.right)
def compare(self, left, right):
if not left and not right: # 一层一层排除
return True
if not (left and right):
return False
if left.val != right.val:
return False
return self.compare(left.left, right.right) and self.compare(left.right, right.left)
2、使用栈
class Solution:
def isSymmetric(self, root: Optional[TreeNode]) -> bool:
st = []
if root is None:
return True
st.append(root.left)
st.append(root.right)
while st:
rightNode = st.pop()
leftNode = st.pop()
if not leftNode and not rightNode:
continue
if not rightNode or not leftNode or leftNode.val != rightNode.val:
return False
st.append(leftNode.left)
st.append(rightNode.right)
st.append(leftNode.right)
st.append(rightNode.left)
return True
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?