返回
左叶子之和:理解左右叶子节点之区别,征服路径之和
后端
2023-12-14 00:12:49
目录
- 左叶子与右叶子的概念
- 递归算法解决左叶子之和
- 代码示例
- 非递归算法解决左叶子之和
- 代码示例
左叶子与右叶子的概念
在二叉树中,左叶子是指没有左孩子的叶节点,右叶子是指没有右孩子的叶节点。
例如,下图中的节点 4
和 5
是左叶子,节点 2
和 3
是右叶子。
1
/ \
2 3
/ \ / \
4 5 6 7
递归算法解决左叶子之和
我们可以使用递归算法来解决左叶子之和问题。具体步骤如下:
- 如果当前节点是左叶子,则将其值加入到结果中。
- 否则,递归遍历左子树和右子树,并将结果相加。
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)
非递归算法解决左叶子之和
我们也可以使用非递归算法来解决左叶子之和问题。具体步骤如下:
- 使用栈来存储当前正在遍历的节点。
- 依次弹出栈顶元素,如果当前节点是左叶子,则将其值加入到结果中。
- 否则,将当前节点的左右孩子依次压入栈中。
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)
总结
左叶子之和问题是一个经典的树形结构问题,可以使用递归或非递归算法来解决。通过理解左叶子与右叶子的概念,我们能够轻松地解决该问题。