📌  相关文章
📜  二叉树中最深的左叶节点|迭代法(1)

📅  最后修改于: 2023-12-03 15:21:39.953000             🧑  作者: Mango

二叉树中最深的左叶节点 - 迭代法

在二叉树中,如果某个节点是叶子节点,并且是它父节点的左儿子,则它是一棵二叉树的最深的左叶节点。

本文将介绍如何使用迭代法来找到一棵二叉树中的最深的左叶节点。

算法思路

使用迭代法来找到一棵二叉树中最深的左叶节点的思路如下:

  1. 使用栈来辅助遍历二叉树,以深度优先的方式进行遍历。
  2. 当遍历到一个节点时,判断该节点是否是叶子节点,并且是否是它父节点的左儿子。
  3. 如果是,则将其深度与节点存储到一个变量中,并更新最大深度与最深的左叶节点。
  4. 遍历完二叉树后,返回最深的左叶节点。
代码实现

下面是实现上述算法的Python代码:

class Solution:
    def findBottomLeftValue(self, root: TreeNode) -> int:
        if not root:
            return None
        
        stack = [(root, 0)]
        left_leaf_depth = -1
        left_leaf_val = None
        
        while stack:
            node, depth = stack.pop()
            
            if not node.left and not node.right and depth > left_leaf_depth and (not left_leaf_val or node == left_leaf_val.parent.left):
                left_leaf_depth = depth
                left_leaf_val = node
                
            if node.right:
                stack.append((node.right, depth + 1))
                
            if node.left:
                stack.append((node.left, depth + 1))
        
        return left_leaf_val.val
代码解析

上述代码中,使用了一个栈来辅助遍历二叉树。栈中存储的是一个二元组(节点,节点的深度),每次遍历时弹出一个节点,并判断是否满足最深的左叶节点的条件。

具体来讲,在判断时,我们需要满足以下要求:

  1. 节点不是空节点
  2. 节点是叶子节点
  3. 节点是它父节点的左儿子
  4. 节点深度大于最深的左叶节点的深度

如果满足以上所有条件,则更新最深的左叶节点的深度与值。

在代码中,我们使用了一个变量 left_leaf_val 来记录最深的左叶节点,并使用一个变量 left_leaf_depth 来记录最深左叶节点的深度。变量 left_leaf_val 初始值为 None,变量 left_leaf_depth 初始值为 -1。在每次判断时,如果满足以上所有条件,则进行更新。

最后遍历完整棵二叉树后,返回最深的左叶节点的值即可。

总结

本文介绍了如何使用迭代法来找到一棵二叉树中最深的左叶节点。具体来讲,我们使用栈来辅助遍历二叉树,每次遍历时判断是否满足最深的左叶节点的条件,如果满足则进行更新。最后返回最深的左叶节点的值。代码实现简单且易理解,是一个不错的二叉树问题的练习题。