Java遍历树的所有叶子节点

在计算机科学中,树是一种常用的数据结构,它由节点组成,每个节点有零个或多个子节点。在树中,叶子节点是指没有子节点的节点。在某些情况下,我们需要遍历树的所有叶子节点来执行特定的操作。本文将介绍如何使用Java实现这一功能。

树的定义

首先,我们需要定义树的数据结构。在Java中,我们可以使用一个类来表示树的节点:

class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;

    TreeNode(int x) {
        val = x;
    }
}

这个类包含三个成员变量:val 表示节点的值,leftright 分别表示左子树和右子树。

遍历叶子节点

要遍历树的所有叶子节点,我们可以使用深度优先搜索(DFS)或广度优先搜索(BFS)。这里我们使用DFS的方法,通过递归实现。

DFS实现

public class Solution {
    public List<Integer> findLeaves(TreeNode root) {
        List<Integer> leaves = new ArrayList<>();
        dfs(root, leaves);
        return leaves;
    }

    private void dfs(TreeNode node, List<Integer> leaves) {
        if (node == null) {
            return;
        }
        // 标记当前节点为叶子节点
        if (node.left == null && node.right == null) {
            leaves.add(node.val);
        }
        // 递归遍历左右子树
        dfs(node.left, leaves);
        dfs(node.right, leaves);
    }
}

在上述代码中,findLeaves 方法接收树的根节点,并返回一个包含所有叶子节点值的列表。dfs 方法是一个递归方法,用于遍历树并收集叶子节点。

甘特图

为了更好地理解遍历过程,我们可以使用甘特图来表示。以下是使用Mermaid语法的甘特图示例:

gantt
    title 遍历树的甘特图
    dateFormat  YYYY-MM-DD
    section 遍历过程
    DFS: done, des1, 2023-04-01, 3d
    BFS: active, des2, after des1, 5d

状态图

我们还可以创建一个状态图来描述遍历过程中的状态变化。以下是使用Mermaid语法的状态图示例:

stateDiagram-v2
    [*] --> 叶子节点: 遇到叶子节点
    叶子节点 --> [*]
    [*] --> 非叶子节点: 遇到非叶子节点
    非叶子节点 --> 左子树: 遍历左子树
    非叶子节点 --> 右子树: 遍历右子树
    左子树 --> [*]
    右子树 --> [*]

结语

通过本文的介绍,我们学习了如何在Java中遍历树的所有叶子节点。我们定义了树的节点结构,并使用DFS方法实现了叶子节点的遍历。此外,我们还通过甘特图和状态图更直观地展示了遍历过程。希望本文能帮助读者更好地理解和掌握树的遍历方法。