借助队列
class Solution(object):
def levelOrder(self, root):
if root==None:
return
que=[]
res=[]
que.append(root)
while len(que)!=0:
arr=[]
for i in range(len(que)):
cur=que.pop(0)
if cur!=None:
arr.append(cur.val)
if cur.left!=None:
que.append(cur.left)
if cur.right!=None:
que.append(cur.right)
res.append(arr)
return res
107. 二叉树的层序遍历 II - 力扣(LeetCode)
只需要将第一题的 res 反过来即可
class Solution(object):
def levelOrderBottom(self, root):
if root==None:
return
que=[]
res=[]
que.append(root)
while len(que)!=0:
arr=[]
for i in range(len(que)):
cur=que.pop(0)
arr.append(cur.val)
if cur.left!=None:
que.append(cur.left)
if cur.right!=None:
que.append(cur.right)
res.append(arr)
for i in range(len(res)-1,-1,-1):
num=res.pop(i)
res.append(num)
return res
题解直接 return result[::-1]
return result[::-1]
result[::-1]
会返回一个新的列表,其元素顺序与原列表result
正好相反。这种操作不会改变原列表,只生成一个新的逆序列表。
在第一题的基础上,当遍历到每一层的最后一个元素时,加入 res 数组。
class Solution(object):
def rightSideView(self, root):
if root==None:
return
que=[]
res=[]
que.append(root)
while len(que)!=0:
n=len(que)
for i in range(n):
cur=que.pop(0)
if cur!=None and i==n-1:
res.append(cur.val)
if cur.left!=None:
que.append(cur.left)
if cur.right!=None:
que.append(cur.right)
return res
注意求平均值时要转化为浮点数
class Solution(object):
def averageOfLevels(self, root):
if root==None:
return
que=[]
res=[]
que.append(root)
while len(que)!=0:
n=len(que)
sum=0
for i in range(n):
cur=que.pop(0)
if cur!=None:
sum+=cur.val
if cur.left!=None:
que.append(cur.left)
if cur.right!=None:
que.append(cur.right)
res.append(float(sum)/n)
return res
只需要将第一题中的左右孩子改为 children 组,遍历 children 将每一个 child 都加入 队列。
class Solution(object):
def levelOrder(self, root):
if root==None:
return
que=[]
res=[]
que.append(root)
while len(que)!=0:
n=len(que)
arr=[]
for i in range(n):
cur=que.pop(0)
if cur!=None:
arr.append(cur.val)
for child in cur.children:
que.append(child)
res.append(arr)
return res
515. 在每个树行中找最大值 - 力扣(LeetCode)
加个 max() 函数即可
class Solution(object):
def largestValues(self, root):
if root==None:
return
que=[]
res=[]
que.append(root)
while len(que)!=0:
arr=[]
for i in range(len(que)):
cur=que.pop(0)
if cur!=None:
arr.append(cur.val)
if cur.left!=None:
que.append(cur.left)
if cur.right!=None:
que.append(cur.right)
res.append(max(arr))
return res
116. 填充每个节点的下一个右侧节点指针 - 力扣(LeetCode)
单独处理每一层的最后一个节点,令其 next 指向空。
class Solution(object):
def connect(self, root):
if root==None:
return
que=[root]
while len(que)!=0:
n=len(que)
for i in range(n):
cur=que.pop(0)
if i==n-1:
cur.next=None
else:
cur.next=que[0]
if cur.left!=None:
que.append(cur.left)
if cur.right!=None:
que.append(cur.right)
return root
117. 填充每个节点的下一个右侧节点指针 II - 力扣(LeetCode)
同上一题,一模一样
class Solution(object):
def connect(self, root):
if root==None:
return
que=[root]
while len(que)!=0:
n=len(que)
for i in range(n):
cur=que.pop(0)
if i==n-1:
cur.next=None
else:
cur.next=que[0]
if cur.left!=None:
que.append(cur.left)
if cur.right!=None:
que.append(cur.right)
return root
将第一题的代码稍加修改,记录一下层数即可
class Solution(object):
def maxDepth(self, root):
if root==None:
return 0
que=[root]
res=0
while len(que)!=0:
res+=1
for i in range(len(que)):
cur=que.pop(0)
if cur.left!=None:
que.append(cur.left)
if cur.right!=None:
que.append(cur.right)
return res
在上一题的基础上,当某个节点为叶子结点时就返回 res 。
class Solution(object):
def minDepth(self, root):
if root==None:
return 0
que=[root]
res=0
while len(que)!=0:
res+=1
for i in range(len(que)):
cur=que.pop(0)
if cur.left!=None:
que.append(cur.left)
if cur.right!=None:
que.append(cur.right)
if cur.left==None and cur.right==None:
return res
return res