513 找树左下角的值(dfs、bfs)

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值