【LeetCode】513. 找树左下角的值

693 阅读1分钟

image.png

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第28天,点击查看活动详情

测试岗位也越来卷了,除了基本的功能测试外,还要有编程基础、脚本经验才脱颖而出。

怎么才能提高我们的编程能力呢,刷LeetCode是最佳的途径之一,话不多数,刷题走起~

一、题目描述:

  • 题目内容

    image.png

  • 题目示例

    image.png

  • 题目解析

    • 二叉树的节点个数的范围是 [1,104]
    • -231 <= Node.val <= 231 - 1

二、思路分析:

我们拿到本题,读取题意要求遍历树,找出树左下角的值。同理,读完题目后我们要从题目中提炼关键几点信息如下:

  • 题目中给出的树的类型为:二叉树
  • 二叉树包含至少一个节点:二叉树无空树的情况
  • 需要求出最左下角的值:最左边的叶子节点的值

前面关于二叉树类型的题目,我们已经刷了一些题目,了解和掌握关于二叉树遍历几种遍方法如下:

  • DFS深度优先遍历:前序遍历、中序遍历、后序遍历
  • BFS广度优先遍历

因此,本次解答该题,我们可以使用两种方法深度优先遍历或者广度优先遍历。

  • 方法一:DFS深度优先遍历

    • 使用递归的方法,对二叉树进行左右节点遍历,并定义一个变量来记录当前深度
    • 当遍历到当前深度时,一定会遍历到当前深度第一个节点为左节点,其值使用curval来存储
    • 当深度height大于当前深度curheight时,则指针节点已经到达另外一层,需要更新当前深度curheight,并且第一个节点的值更新在curVal中
    • Python2中,无nonlocal概念,因此我们定义一个列表来存储[curheight,curval]

    按照深度优先遍历思想,结合案例2来手动画图,如下所示:

    image.png 根据上述思路,使用Python代码实现如下:

    # Definition for a binary tree node.
    # class TreeNode(object):
    #     def __init__(self, val=0, left=None, right=None):
    #         self.val = val
    #         self.left = left
    #         self.right = right
    class Solution(object):
        def findBottomLeftValue(self, root):
            """
            :type root: TreeNode
            :rtype: int
            """
            def dfs(root,height):
                if root is None:
                    return
                height +=1
                dfs(root.left,height)
                dfs(root.right,height) 
                if height > res[0]:
                    res[0] = height
                    res[1] = root.val
    
            res = [0,0]
            dfs(root,0)
            return res[1]
    
  • 方法二:BFS广度优先遍历

    • BFS广度优先遍历,一层一层的遍历二叉树
    • 定义一个队列,按照先右节点再左节点的顺序添加到队列中
    • 广度优先遍历队列中最后一个节点就是底层最左边的节点 按照广度优先遍历思想,结合案例2来手动画图,如下所示:

    image.png 根据上述思路,使用Python代码实现如下:

    class Solution(object):
        def findBottomLeftValue(self, root):
            """
            :type root: TreeNode
            :rtype: int
            """
            ans = 0
            bfs = collections.deque()
            bfs.append(root)
    
            while bfs:   
                node  = bfs.popleft()
                if node.right != None:
                    bfs.append(node.right)
                if node.left != None:
                    bfs.append(node.left)
                ans = node.val
    
            return ans
    

三、总结:

本题考察二叉树深度优先和广度优先遍历的应用,最左下角的节点,对于深度优先来说就是下一层的第一个节点,对于广度优先来说就是队列的最后一个节点,AC提交记录如下:

image.png

  • 时间复杂度O(n)
  • 空间复杂度O(n)

以上是本期内容,欢迎大佬们点赞评论,下期见~~~