代码随想录 -- 二叉树 -- 二叉树层序遍历

102. 二叉树的层序遍历 - 力扣(LeetCode)

借助队列

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正好相反。这种操作不会改变原列表,只生成一个新的逆序列表。

199. 二叉树的右视图 - 力扣(LeetCode)

在第一题的基础上,当遍历到每一层的最后一个元素时,加入 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
        
        

 

637. 二叉树的层平均值 - 力扣(LeetCode)

注意求平均值时要转化为浮点数

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
        

429. N 叉树的层序遍历 - 力扣(LeetCode) 

只需要将第一题中的左右孩子改为 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

104. 二叉树的最大深度 - 力扣(LeetCode)

将第一题的代码稍加修改,记录一下层数即可

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

111. 二叉树的最小深度 - 力扣(LeetCode)

在上一题的基础上,当某个节点为叶子结点时就返回 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

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值