返回

左叶子之和:理解左右叶子节点之区别,征服路径之和

后端

目录

  • 左叶子与右叶子的概念
  • 递归算法解决左叶子之和
    • 代码示例
  • 非递归算法解决左叶子之和
    • 代码示例

左叶子与右叶子的概念

在二叉树中,左叶子是指没有左孩子的叶节点,右叶子是指没有右孩子的叶节点。

例如,下图中的节点 45 是左叶子,节点 23 是右叶子。

        1
      /   \
     2     3
    / \   / \
   4   5 6   7

递归算法解决左叶子之和

我们可以使用递归算法来解决左叶子之和问题。具体步骤如下:

  1. 如果当前节点是左叶子,则将其值加入到结果中。
  2. 否则,递归遍历左子树和右子树,并将结果相加。
def sum_of_left_leaves(root):
  if not root:
    return 0

  # 如果当前节点是左叶子
  if not root.left and not root.right:
    return root.val

  # 否则,递归遍历左子树和右子树
  return sum_of_left_leaves(root.left) + sum_of_left_leaves(root.right)

代码示例

# 定义二叉树节点类
class Node:
  def __init__(self, val, left=None, right=None):
    self.val = val
    self.left = left
    self.right = right

# 创建二叉树
root = Node(1)
root.left = Node(2)
root.right = Node(3)
root.left.left = Node(4)
root.left.right = Node(5)
root.right.left = Node(6)
root.right.right = Node(7)

# 计算左叶子之和
result = sum_of_left_leaves(root)

# 输出结果
print("左叶子之和:", result)

非递归算法解决左叶子之和

我们也可以使用非递归算法来解决左叶子之和问题。具体步骤如下:

  1. 使用栈来存储当前正在遍历的节点。
  2. 依次弹出栈顶元素,如果当前节点是左叶子,则将其值加入到结果中。
  3. 否则,将当前节点的左右孩子依次压入栈中。
def sum_of_left_leaves(root):
  if not root:
    return 0

  stack = [root]
  result = 0

  while stack:
    # 弹出栈顶元素
    node = stack.pop()

    # 如果当前节点是左叶子
    if not node.left and not node.right:
      result += node.val

    # 否则,将当前节点的左右孩子依次压入栈中
    else:
      if node.left:
        stack.append(node.left)
      if node.right:
        stack.append(node.right)

  return result

代码示例

# 定义二叉树节点类
class Node:
  def __init__(self, val, left=None, right=None):
    self.val = val
    self.left = left
    self.right = right

# 创建二叉树
root = Node(1)
root.left = Node(2)
root.right = Node(3)
root.left.left = Node(4)
root.left.right = Node(5)
root.right.left = Node(6)
root.right.right = Node(7)

# 计算左叶子之和
result = sum_of_left_leaves(root)

# 输出结果
print("左叶子之和:", result)

总结

左叶子之和问题是一个经典的树形结构问题,可以使用递归或非递归算法来解决。通过理解左叶子与右叶子的概念,我们能够轻松地解决该问题。