offer32-i 题:从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印
#广度优先搜索
class Solution:
def levelOrder(self, root: TreeNode) -> List[int]:
if not root:return []
res,sub=[],collections.deque()
sub.append(root)
while sub:
node=sub.popleft()#出来一个 并从sub中删除
res.append(node.val)#放进列表
#瞧瞧当前节点的左右子节点
if node.left:
sub.append(node.left)
if node.right:
sub.append(node.right)
return res
- collections.deque() 是双边队列,具有列表和栈的性质。在队列两端插入、删除元素时间复杂度是
O(1)
,在列表开头插入、删除元素时间复杂度是O(N)
。
python3 deque(双向队列) - Water~ - 博客园 (cnblogs.com)https://www.cnblogs.com/zhenwei66/p/6598996.html
offe32-ii 题:每层打印到一行。
#与上一道类似,主要是思考如何分层,直接用层节点数最省时间和空间。for遍历当前层节点数len(sub),将当前层全部节点打印到一行tmp。
class Solution:
def levelOrder(self, root: TreeNode) -> List[List[int]]:
if not root:return []
res,sub=[],collections.deque()
sub.append(root)
while sub:
tmp=[]
for i in range(len(sub)):#!!!循环次数为当前层节点数 牛
node=sub.popleft()#出来一个 并从sub中删除
tmp.append(node.val)#放进列表
if node.left:
sub.append(node.left)
if node.right:
sub.append(node.right)
res.append(tmp)
return res
offer32-iii 题:之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,
- 在于确定奇偶数层,正倒存储该层
class Solution:
def levelOrder(self, root: TreeNode) -> List[List[int]]:
if not root:return []
res,sub=[],collections.deque()
sub.append(root)
j=1
while sub:
tmp=[]
for i in range(len(sub)):
node=sub.popleft()
tmp.append(node.val)
if node.left:
sub.append(node.left)
if node.right:
sub.append(node.right)
if j%2==0:
res.append(tmp[::-1])#偶数层 -> 该层倒着放入
else:
res.append(tmp)#奇数层 -> 该层正着放入
j+=1
return res
NC45 题: 给定一棵二叉树,分别按照二叉树先序,中序和后序打印所有的节点。
class Solution:
def threeOrders(self , root: TreeNode) -> List[List[int]]:
gen,zhong,hou=[],[],[]
def find(root):
if not root: return
gen.append(root.val)#(根序)根左右
find(root.left)#(中序)左根右
zhong.append(root.val)#找到第一个
find(root.right)#(后序)左右根
hou.append(root.val)
find(root)
return [gen,zhong,hou]