持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第28天,点击查看活动详情
测试岗位也越来卷了,除了基本的功能测试外,还要有编程基础、脚本经验才脱颖而出。
怎么才能提高我们的编程能力呢,刷LeetCode是最佳的途径之一,话不多数,刷题走起~
一、题目描述:
-
题目内容
-
题目示例
-
题目解析
- 二叉树的节点个数的范围是
[1,104] -231 <= Node.val <= 231 - 1
- 二叉树的节点个数的范围是
二、思路分析:
我们拿到本题,读取题意要求遍历树,找出树左下角的值。同理,读完题目后我们要从题目中提炼关键几点信息如下:
- 题目中给出的树的类型为:二叉树
- 二叉树包含至少一个节点:二叉树无空树的情况
- 需要求出最左下角的值:最左边的叶子节点的值
前面关于二叉树类型的题目,我们已经刷了一些题目,了解和掌握关于二叉树遍历几种遍方法如下:
- DFS深度优先遍历:前序遍历、中序遍历、后序遍历
- BFS广度优先遍历
因此,本次解答该题,我们可以使用两种方法深度优先遍历或者广度优先遍历。
-
方法一:DFS深度优先遍历
- 使用递归的方法,对二叉树进行左右节点遍历,并定义一个变量来记录当前深度
- 当遍历到当前深度时,一定会遍历到当前深度第一个节点为左节点,其值使用curval来存储
- 当深度height大于当前深度curheight时,则指针节点已经到达另外一层,需要更新当前深度curheight,并且第一个节点的值更新在curVal中
- Python2中,无nonlocal概念,因此我们定义一个列表来存储[curheight,curval]
按照深度优先遍历思想,结合案例2来手动画图,如下所示:
根据上述思路,使用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来手动画图,如下所示:
根据上述思路,使用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提交记录如下:
- 时间复杂度O(n)
- 空间复杂度O(n)
以上是本期内容,欢迎大佬们点赞评论,下期见~~~