数据结构与算法之 leetcode 二叉树路径 所有根到叶子路径

数据结构与算法阿木 发布于 6 天前 2 次阅读


二叉树路径(所有根到叶子路径)在LeetCode中的实现与优化

二叉树是数据结构中的一种,它由节点组成,每个节点最多有两个子节点:左子节点和右子节点。在编程中,二叉树的应用非常广泛,特别是在算法设计中。LeetCode作为全球知名的在线编程竞赛平台,提供了大量的编程题目,其中涉及到二叉树的题目尤为常见。本文将围绕LeetCode中的“二叉树路径(所有根到叶子路径)”这一主题,探讨其实现方法、优化策略以及相关算法。

问题分析

题目要求我们找出二叉树中所有从根节点到叶子节点的路径。叶子节点是指没有子节点的节点。在遍历二叉树的过程中,我们需要记录当前路径,并在到达叶子节点时输出该路径。

实现方法

递归法

递归法是解决此类问题的常用方法。以下是一个使用递归法实现的示例代码:

python

class TreeNode:


def __init__(self, x):


self.val = x


self.left = None


self.right = None

def binary_tree_paths(root):


if not root:


return []


if not root.left and not root.right:


return [str(root.val)]


left_paths = binary_tree_paths(root.left)


right_paths = binary_tree_paths(root.right)


return [str(root.val) + "->" + path for path in left_paths + right_paths]

测试代码


root = TreeNode(1)


root.left = TreeNode(2)


root.right = TreeNode(3)


root.left.left = TreeNode(4)


root.left.right = TreeNode(5)


print(binary_tree_paths(root))


迭代法

迭代法通常使用栈来实现。以下是一个使用迭代法实现的示例代码:

python

class TreeNode:


def __init__(self, x):


self.val = x


self.left = None


self.right = None

def binary_tree_paths(root):


if not root:


return []


stack, path = [root], [str(root.val)]


while stack:


node = stack.pop()


if not node.left and not node.right:


yield '->'.join(path + [str(node.val)])


if node.right:


stack.append(node.right)


path.append(str(node.right.val))


if node.left:


stack.append(node.left)


path.append(str(node.left.val))

测试代码


root = TreeNode(1)


root.left = TreeNode(2)


root.right = TreeNode(3)


root.left.left = TreeNode(4)


root.left.right = TreeNode(5)


for path in binary_tree_paths(root):


print(path)


优化策略

1. 优化递归法

在递归法中,我们可以通过剪枝来优化算法。当发现某个节点没有子节点时,我们可以直接返回当前路径,而不是继续递归。

2. 优化迭代法

在迭代法中,我们可以使用一个额外的变量来记录当前路径,而不是在每次循环中更新整个路径列表。这样可以减少内存消耗。

总结

本文介绍了二叉树路径(所有根到叶子路径)在LeetCode中的实现方法,包括递归法和迭代法。我们还探讨了优化策略,以提升算法的效率。在实际应用中,我们可以根据具体需求选择合适的实现方法,并对算法进行优化。希望本文对您有所帮助。