📅  最后修改于: 2023-12-03 15:40:32.374000             🧑  作者: Mango
我们需要检查一个二叉树是否由一对总和为 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)。