📜  二叉树中最深的左叶节点(1)

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

二叉树中最深的左叶节点

二叉树是一种常用的数据结构,其中每个节点最多有两个子节点。在二叉树中,如果一个节点没有左子节点,那么它就不是左叶节点;如果它有左子节点,那么它的左子节点就是左叶节点。求解二叉树中最深的左叶节点是一道经典的算法问题,它可以通过深度优先搜索(DFS)和广度优先搜索(BFS)等多种算法实现。

BFS解法

我们可以使用BFS算法来求解二叉树中最深的左叶节点。

算法步骤
  1. 根据BFS的思路,我们需要使用队列来存储待处理的节点。
  2. 我们从根节点开始遍历二叉树,将根节点加入队列。
  3. 循环处理队列中的节点,直到队列为空为止。
  4. 对于每个节点,我们需要判断它是否是左叶节点。如果是左叶节点,则记录其深度和值。
  5. 如果不是左叶节点,则将该节点的左子节点和右子节点加入队列中。
  6. 最终,我们可以得到二叉树中最深的左叶节点。
代码实现
def findDeepestLeftLeaf(root):
    if not root:
        return None
    
    q = [(root, 0)]
    deepest_left_leaf = None
    deepest_left_leaf_depth = 0
    
    while q:
        node, depth = q.pop(0)
        
        if node.left:
            q.append((node.left, depth + 1))
            if not node.left.left and not node.left.right and depth + 1 > deepest_left_leaf_depth:
                deepest_left_leaf = node.left
                deepest_left_leaf_depth = depth + 1
        
        if node.right:
            q.append((node.right, depth + 1))
            
    return deepest_left_leaf.val if deepest_left_leaf else None
DFS解法

我们也可以使用DFS算法来求解二叉树中最深的左叶节点。在DFS算法中,我们可以使用一个参数来表示当前节点是否是左叶节点,然后递归处理左右子节点。如果当前节点是左叶节点,则记录其深度和值,否则继续递归处理子节点。

代码实现
def findDeepestLeftLeaf(root):
    if not root:
        return None
    
    deepest_left_leaf = None
    deepest_left_leaf_depth = 0
    
    def dfs(node, is_left, depth):
        nonlocal deepest_left_leaf, deepest_left_leaf_depth
        
        if not node:
            return
        
        if is_left and not node.left and not node.right and depth > deepest_left_leaf_depth:
            deepest_left_leaf = node
            deepest_left_leaf_depth = depth
        
        dfs(node.left, True, depth + 1)
        dfs(node.right, False, depth + 1)
    
    dfs(root.left, True, 1)
    dfs(root.right, False, 1)
    
    return deepest_left_leaf.val if deepest_left_leaf else None
总结

求解二叉树中最深的左叶节点是一道经典的算法问题,可以使用BFS和DFS等多种算法实现。在实现过程中,我们需要注意算法的正确性和效率,尤其是在遇到复杂的二叉树结构时。