本系列博客记录学习图解算法数据结构(链接:力扣)
1.剑指 Offer 32 - I. 从上到下打印二叉树
从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。
根据题目要求,即是对二叉树进行中序遍历(中左右)。可以按照队列的性质暂时存储根节点,并并不断把根节点的左右节点加在队列后面:
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def levelOrder(self, root: TreeNode) -> List[int]:
result, quene = [], []
if not root:
return []
quene.append(root)
while quene:
if quene[0].left:
quene.append(quene[0].left)
if quene[0].right:
quene.append(quene[0].right)
result.append(quene[0].val)
del quene[0]
return result
2.剑指 Offer 32 - II. 从上到下打印二叉树 II
从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。
这道题在第1题的基础上加上了要求,要每层的节点在一个数组中,也就是说把上一层的所有左右节点按顺序放在队列中:
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def levelOrder(self, root: TreeNode) -> List[List[int]]:
if not root: return []
res, quene = [], []
quene.append(root)
while quene:
l = len(quene) - 1
temp = []
while l >= 0:
if quene[0].left:
quene.append(quene[0].left)
if quene[0].right:
quene.append(quene[0].right)
temp.append(quene[0].val)
del quene[0]
l -= 1
res.append(temp)
return res
3.
剑指 Offer 32 - III. 从上到下打印二叉树 III
请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。
这道题在第2题的基础上又加上了奇数行和偶数行不一样的要求,加上一个flag:
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def levelOrder(self, root: TreeNode) -> List[List[int]]:
if not root: return []
res, quene,flag = [], [], True
quene.append(root)
while quene:
l = len(quene) - 1
temp,temp1 = [],[]
while l >= 0:
if quene[0].left:
quene.append(quene[0].left)
if quene[0].right:
quene.append(quene[0].right)
temp.append(quene[0].val)
del quene[0]
l -= 1
if flag:
res.append(temp)
flag = False
else:
while temp:
temp1.append(temp.pop())
res.append(temp1)
flag = True
return res
前两题的用时效果都还不错,第三题的用时效果中等,可以只用一个temp数组来提高效率