📌  相关文章
📜  检查二叉树是否由一对总和为K的叶子节点组成(1)

📅  最后修改于: 2023-12-03 14:55:44.253000             🧑  作者: Mango

检查二叉树是否由一对总和为K的叶子节点组成

问题描述

给定一棵二叉树和一个整数K,判断该二叉树是否存在一对叶子节点,它们的和为K。

思路分析

该问题可以通过深度优先搜索(DFS)解决。具体思路如下:

  1. 从根节点开始深度优先遍历二叉树,遍历过程中记录每个叶子节点的值和深度;
  2. 对于每个叶子节点,遍历其父节点到根节点的路径,记录路径上所有节点值的和;
  3. 遍历完所有叶子节点和其对应路径的和后,检查是否存在一对路径的和等于K的叶子节点。

时间复杂度为 $O(n^2)$,其中 n 表示节点数。

代码实现
class Solution:
    def hasPathSum(self, root: TreeNode, sum: int) -> bool:
        leaf_nodes = []
        path_sums = []
        
        def dfs(node, depth, path_sum):
            if node is None:
                return
            elif node.left is None and node.right is None:
                leaf_nodes.append((node.val, depth))
                path_sums.append(path_sum + node.val)
            else:
                dfs(node.left, depth + 1, path_sum + node.val)
                dfs(node.right, depth + 1, path_sum + node.val)
        
        dfs(root, 0, 0)
        for i in range(len(leaf_nodes)):
            for j in range(i + 1, len(leaf_nodes)):
                if leaf_nodes[i][1] != leaf_nodes[j][1]:
                    continue
                if path_sums[i] + path_sums[j] == sum:
                    return True
        return False

其中,leaf_nodes 列表用于存储每个叶子节点的值和深度,path_sums 列表用于存储每个叶子节点对应路径上所有节点值的和。dfs 函数用于进行深度遍历,直到处理到叶子节点时将该节点的值和深度存入 leaf_nodes 列表,并将该节点到根节点路径上所有节点值的和存入 path_sums 列表。最后,对于每一对深度相同的叶子节点,检查它们对应的路径和是否等于目标值 sum。若存在,则返回 True;否则返回 False。

代码片段需按markdown标明,已在上述代码块中标注。