1. 问题描述:
给定一个二叉树,在树的最后一行找到最左边的值。
示例 1:
输入:
2
/ \
1 3
输出:
1
示例 2:
输入:
1
/ \
2 3
/ / \
4 5 6
/
7
输出:
7
注意: 您可以假设树(即给定的根节点)不为 NULL。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/find-bottom-left-tree-value
2. 思路分析:
① 因为是关于二叉树的题目,所以可以使用深度优先搜索或者是广度优先搜索解决,当使用深度优先搜索解决的时候可以利用深度优先搜索先纵后横的特点(一条路走到黑),也就是会先访问二叉树中左下角的节点,基于dfs的这个特点我们可以在dfs方法中传递一个变量,用来记录当前节点的深度,这样当递归到叶子节点的时候进行判断看深度是否大于了历史上记录的最大深度,假如深度增加了说明应该更新历史上记录的答案与当前的最大深度,所以根据最先访问的叶子节点肯定是当前深度对应的左边的节点我们只需要判断深度是否增大来进行更新对应的变量即可
② 对于bfs也是类似的,从当前的根节点出发,一直到弹出队列的节点为叶子节点的时候判断当前的深度是否大于记录的最大深度,假如满足那么应该更新答案与当前的最大深度,与dfs类似的是最先访问的叶子节点肯定是左边的节点所以需要根据深度是否增大了来更新答案与最大深度
3. 代码如下:
dfs:
class TreeNode:
def __init__(self, x):
self.val = x
self.left = None
self.right = None
class Solution:
# 使用全局变量记录答案与最大深度
res, maxDepth = 0, 0
def dfs(self, root: TreeNode, d: int):
# 当节点为空的时候直接返回
if not root: return
# 叶子节点
if not root.left and not root.right:
# 当深度变大的时候那么需要更新答案与最大深度
if d > self.maxDepth:
self.maxDepth = d
self.res = root.val
# 返回到叶子节点的上一层
return
self.dfs(root.left, d + 1)
self.dfs(root.right, d + 1)
def findBottomLeftValue(self, root: TreeNode) -> int:
# 判断是否只有一个根节点
if not root.left and not root.right: return root.val
self.dfs(root, 0)
return self.res
bfs:
import collections
class TreeNode:
def __init__(self, x):
self.val = x
self.left = None
self.right = None
class Solution:
def findBottomLeftValue(self, root: TreeNode) -> int:
# 判断是否只有一个根节点
if not root.left and not root.right: return root.val
# 初始化双端队列
res, maxDepth = 0, 0
# 使用元组非常方便记录当前节点以及深度
queue = collections.deque([(root, 0)])
while queue:
poll = queue.popleft()
# 判断是否是叶子节点
if not poll[0].left and not poll[0].right:
# 深度是增大的而且是最先访问的那个节点那么就应该更新答案以及最大深度
if poll[1] > maxDepth:
res = poll[0].val
maxDepth = poll[1]
# 添加当前节点的左右孩子
if poll[0].left: queue.append((poll[0].left, poll[1] + 1))
if poll[0].right: queue.append((poll[0].right, poll[1] + 1))
return res