0
点赞
收藏
分享

微信扫一扫

java 树 深度广度遍历

Java 树的深度与广度遍历

在计算机科学中,树是一种重要的数据结构,它由结点(Node)和连接这些结点的边(Edge)组成。树的遍历是对树结构进行检索的过程,主要分为深度优先遍历(Depth-First Search, DFS)和广度优先遍历(Breadth-First Search, BFS)。本文将详细介绍这两种遍历方式,并通过代码示例进行讲解。

树的基本结构

在Java中,树的节点通常用一个简单的类表示。一个基本的树节点结构如下:

class TreeNode {
    int value;
    List<TreeNode> children;

    public TreeNode(int value) {
        this.value = value;
        this.children = new ArrayList<>();
    }
}

深度优先遍历(DFS)

深度优先遍历是一种递归的遍历方式,它从树的根节点开始,尽可能深入到每一个子节点,直到节点没有子节点为止,然后再回溯。以下是深度优先遍历的代码示例:

// 深度优先遍历
public void depthFirstSearch(TreeNode node) {
    if (node == null) return;
    
    System.out.print(node.value + " ");
    for (TreeNode child : node.children) {
        depthFirstSearch(child);
    }
}

深度优先遍历的示意图(甘特图)

gantt
    title 深度优先遍历示意图
    section 遍历流程
    根节点        :a1, 2023-10-01, 30d
    子节点1      :after a1  , 20d
    子节点1.1  :after a1  , 15d
    子节点1.2  :after a1  , 10d
    子节点2    :after a1  , 20d

广度优先遍历(BFS)

与深度优先遍历不同,广度优先遍历是一种逐层访问(即同一层的节点先被访问)的遍历方式。它使用队列来实现,首先访问根节点,然后依次访问根节点的所有子节点,接着访问它们的子节点。以下是广度优先遍历的代码示例:

// 广度优先遍历
public void breadthFirstSearch(TreeNode root) {
    if (root == null) return;
    
    Queue<TreeNode> queue = new LinkedList<>();
    queue.add(root);
    
    while (!queue.isEmpty()) {
        TreeNode node = queue.poll();
        System.out.print(node.value + " ");
        queue.addAll(node.children);
    }
}

广度优先遍历的示意图(序列图)

sequenceDiagram
    participant A as 根节点
    participant B as 子节点1
    participant C as 子节点2
    participant D as 子节点1.1
    participant E as 子节点1.2
    A->>B: 访问
    A->>C: 访问
    B->>D: 访问
    B->>E: 访问

结束语

深度优先遍历和广度优先遍历是树的两种基本遍历方法,各有其特点与适用场景。深度优先遍历适合需要递归解决问题的场景,比如求解迷宫等;而广度优先遍历则更适合查找最短路径等问题,因其保证了先遍历同一层的节点。树结构的使用广泛贯穿于计算机科学的许多领域,通过掌握这两种遍历方法,我们可以更有效地解决各种实际问题。

举报

相关推荐

0 条评论