树 做题总结(二)[513,102,107,199,637] BFS

本文介绍了如何使用广度优先搜索算法在二叉树中找到左下角的值,并展示了两种实现方式:迭代和递归。同时,讲解了如何获取二叉树的右视图,即每一层的最右边节点。通过这些层次遍历技巧,深入理解了二叉树的层次结构操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

513. 找树左下角的值

在这里插入图片描述

思路:广度优先搜索,按层遍历,记录每层第一个,最后一层的第一个即为答案。两个条件,最左侧(第一个)和最后一层。
注意:迭代和递归两种都要掌握
代码:

class Solution:
    def findBottomLeftValue(self, root: Optional[TreeNode]) -> int:
        # 层序遍历迭代法
            # if not root:
            #     return 
            
            # from collections import deque
            # que = deque([root])      
            # while que:
            #     res = que[0]
            #     size = len(que)
            #     for _ in range(size):
            #         cur = que.popleft()
            #         if cur.left:
            #             que.append(cur.left)
            #         if cur.right:
            #             que.append(cur.right)
            #     if not que:
            #         return res.val
            
        res = []
        def bfs(root, depth):
            if not root: return []
            if len(res) == depth: res.append([]) # start the current depth
            res[depth].append(root.val) # fulfil the current depth
            if  root.left: bfs(root.left, depth + 1) 
            if  root.right: bfs(root.right, depth + 1)
        bfs(root, 0)
        return res[-1][0]

102/107. 二叉树的层序遍历

在这里插入图片描述
在这里插入图片描述

思路:
首先根元素入队
当队列不为空的时候
求当前队列的长度
依次从队列中取 s 个元素进行拓展,然后进入下一次迭代
注意:迭代和递归两种都要掌握
根节点–每一层–层中的每一个节点(判断左右孩子)
代码:

class Solution:
    def levelOrder(self, root: TreeNode) -> List[List[int]]:
        # 迭代
        # if not root:
        #     return []
        # results = []
        # from collections import deque
        # que = deque([root])
        # while que:
        #     result=[]
        #     for _ in  range(len(que)):
        #         cur = que.popleft()
        #         result.append(cur.val)
        #         if cur.left:
        #             que.append(cur.left)
        #         if cur.right:
        #             que.append(cur.right)
        #     results.append(result)
        # return results
        # 递归
        
        res=[]
        def bfs(root, depth):
            nonlocal res
            if not root: return []
            if len(res) == depth: 
                res.append([]) # start the current depth
            res[depth].append(root.val) # fulfil the current depth
            if  root.left: 
                bfs(root.left, depth + 1) # process child nodes for the next depth
            if  root.right: 
                bfs(root.right, depth + 1)
        bfs(root, 0)
        return res
		#与107的不同在于反向输出,自底向上
        return result[::-1]

199. 二叉树的右视图

在这里插入图片描述

思路:对二叉树进行层次遍历BFS,那么对于每层来说,最右边的结点一定是最后被遍历到的。二叉树的层次遍历可以用广度优先搜索实现。每次第一层遍历中取最后一个节点的val
注意:迭代和递归两种都要掌握
代码:

class Solution:
    def rightSideView(self, root: TreeNode) -> List[int]:
        if not root:
            return []
        result = []
        from collections import deque
        collections 
        que = deque([root])
        while que:
            result.append(que[-1].val)
            for _ in  range(len(que)):
                cur = que.popleft()
                if cur.left:
                    que.append(cur.left)
                if cur.right:
                    que.append(cur.right)
        return result

637. 二叉树的层平均值

在这里插入图片描述

思路:对二叉树进行层次遍历BFS,对每层内所有节点求总和
注意:len(que)不固定,所以要令n=len(que), for _ in range(n)
代码:

class Solution:
    def averageOfLevels(self, root: Optional[TreeNode]) -> List[float]:
        if not root:
            return []
        result=[]
        que = collections.deque([root])
        while que:
            summ=0
            n=len(que)

            for _ in range(n):
                cur = que.popleft()
                summ=summ+cur.val
                if cur.left:
                    que.append(cur.left)
                if cur.right:
                    que.append(cur.right)
            result.append(summ/n)
        return result
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值