返回

从根到叶的二进制数之和:用树遍历求解!

后端

问题背景

给你一棵二叉树的根节点 root ,树中每个节点都有一个 0 到 1 之间的数字作为它的值。从根节点开始,从左到右按层次遍历二叉树,并把所有节点的值组合起来形成一个二进制数。

例如,下图所示的二叉树在层次遍历后形成的二进制数为 1101010。

      1
    /   \
   0     1
  / \   / \
 0   1 0   1

返回从根到叶的所有路径二进制数之和。

解题思路

为了解决这个问题,我们可以使用深度优先搜索 (DFS) 算法。具体步骤如下:

  1. 从根节点开始,对二叉树进行深度优先搜索。
  2. 在每次访问一个节点时,将该节点的值附加到当前的二进制数的末尾。
  3. 如果当前节点是叶节点,则将当前的二进制数添加到结果列表中。
  4. 否则,继续对该节点的左右子树进行深度优先搜索。

以下是用 Python 实现的代码:

def sumRootToLeaf(root):
  # 如果根节点为空,则返回0
  if not root:
    return 0

  # 如果根节点是叶节点,则返回根节点的值
  if not root.left and not root.right:
    return root.val

  # 否则,继续对左子树和右子树进行深度优先搜索
  left_sum = sumRootToLeaf(root.left)
  right_sum = sumRootToLeaf(root.right)

  # 将左子树和右子树的二进制数之和返回
  return (root.val << 1) + left_sum + right_sum

# 测试代码
root = TreeNode(1)
root.left = TreeNode(0)
root.right = TreeNode(1)
root.left.left = TreeNode(0)
root.left.right = TreeNode(1)
root.right.left = TreeNode(0)
root.right.right = TreeNode(1)
print(sumRootToLeaf(root))  # 输出:22

时间复杂度和空间复杂度

  • 时间复杂度:O(N),其中 N 是二叉树中的节点数。这是因为我们需要对每个节点进行访问一次。
  • 空间复杂度:O(H),其中 H 是二叉树的高度。这是因为我们需要在递归调用中存储当前的二进制数。

总结

在这个 LeetCode 问题中,我们使用深度优先搜索算法成功求解了这个问题。我们从根节点开始,对二叉树进行了深度优先搜索,并将在每个节点访问时将该节点的值附加到当前的二进制数的末尾。最后,我们将所有叶节点的二进制数之和返回。这个算法的时间复杂度为 O(N),空间复杂度为 O(H)。