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

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

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

简介

我们需要检查一个二叉树是否由一对总和为 K 的叶节点组成。具体来说,我们需要检查是否存在两个叶节点 a,b 使得 a.val + b.val = K。

解法

我们可以考虑深度优先搜索,递归地遍历二叉树的每一个节点。对于每一个节点,如果它是叶节点,则将它的值加入候选的值列表中。如果它不是叶节点,则继续递归遍历左右子树。当我们遍历到一个节点时,可以用目标值 K 减去当前节点的值,然后在候选的值列表中查找是否存在这个差值。

代码
class Solution:
    def findPair(self, root: TreeNode, k: int) -> bool:
        def dfs(node):
            nonlocal k, values
            if not node:
                return
            if not node.left and not node.right:
                values.append(node.val)
            dfs(node.left)
            dfs(node.right)
        values = []
        dfs(root)
        s = set()
        for val in values:
            if k - val in s:
                return True
            s.add(val)
        return False
复杂度分析

该算法的时间复杂度为 O(n),其中 n 是二叉树的节点数。我们需要对每一个节点都进行一次遍历。空间复杂度为 O(n),其中 n 是二叉树的节点数。我们需要用一个列表存储所有叶子节点的值。同时,在深度优先搜索中,我们需要用一个栈来保存递归调用的上下文,最坏情况下空间复杂度为 O(n)。