访问二叉树的叶子结点

养老保险 2025-08-26 02:10www.baoxiank.com养老保险

方法一:递归前序遍历

当我们想要二叉树的叶子节点时,我们可以采用递归前序遍历的方式。这种方式就像我们深入每一层级的节点,亲自检查每一个节点是否为叶子节点。代码示例如下:

```python

class TreeNode:

def __init__(self, val=0, left=None, right=None):

self.val = val

self.left = left

self.right = right

def traverse_and_find_leaves_recursively(root):

leaf_nodes = [] 用于存储叶子节点的列表

def helper(node): 辅助函数,进行递归遍历

if node is None: 如果节点为空,直接返回

return

if node.left is None and node.right is None: 如果节点是叶子节点

leaf_nodes.append(node.val) 将该叶子节点添加到列表中

helper(node.left) 递归遍历左子树

helper(node.right) 递归遍历右子树

helper(root) 从根节点开始遍历

return leaf_nodes 返回叶子节点的列表

```

方法二:迭代前序遍历

除了递归,我们还可以使用迭代的方式模拟前序遍历,利用栈来存储待处理的节点。代码示例如下:

```python

def iterate_and_find_leaves(root):

if not root: 如果树为空,直接返回空列表

return []

stack = [root] 将根节点放入栈中

leaf_nodes = [] 用于存储叶子节点的列表

while stack: 当栈不为空时,继续处理节点

node = stack.pop() 弹出栈顶节点进行处理

if node.left is None and node.right is None: 如果节点是叶子节点

leaf_nodes.append(node.val) 将该叶子节点添加到列表中

if node.right: 先将右子节点入栈,确保左子树先被处理(满足前序遍历顺序)

stack.append(node.right)

if node.left: 再将左子节点入栈

stack.append(node.left) 因为栈是后进先出的,所以先入栈的左子节点会被后处理

return leaf_nodes 返回叶子节点的列表

```

方法三:层次遍历(广度优先搜索) 层次遍历是一种逐层访问二叉树节点的方法。我们使用队列来按层存放待处理的节点。代码示例如下: 层次遍历可以确保按照树的层级结构顺序访问每一个节点,包括叶子节点。 ```python from collections import deque def bfs_find_leaves(root): if not root: return [] queue = deque([root]) 使用双端队列来模拟队列操作 leaf_nodes = [] while queue: node = queue.popleft() 从队列的左侧弹出一个节点进行处理 if node.left is None and node.right is None: 如果该节点是叶子节点 leaf_nodes.append(node.val) 将该叶子节点的值添加到列表中 else: 如果该节点不是叶子节点 if node.left: 将左子节点加入队列 queue.append(node.left) if node.right: 将右子节点加入队列 queue.append(node.right) return leaf_nodes 返回包含所有叶子节点值的列表 解释 递归前序遍历:先处理当前节点(包括判断是否为叶子节点),再递归处理左右子树。迭代前序遍历:利用栈模拟递归过程,确保节点的处理顺序符合前序遍历的要求。层次遍历(广度优先搜索):按照树的层级结构逐层访问节点,包括叶子节点。这些方法在时间和空间复杂度上相似,可以根据具体需求和场景选择合适的方法。 ``` 以上三种方法都是用来访问二叉树的叶子节点的有效手段。它们各有特点,可以根据实际情况选择使用。

Copyright © 2019-2025 www.baoxiank.com 保险课 版权所有 Power by

生育保险,养老保险,医疗保险,工伤保险,保险课,社会保险,失业保险,大病保险,意外保险,财产保险,健康保险,旅游保险,儿童保险