当前位置:首页 > Java

java如何遍历树

2026-02-05 06:07:24Java

遍历树的方法

在Java中,树的遍历通常分为深度优先遍历(DFS)和广度优先遍历(BFS)。以下是常见的几种遍历方式及其实现方法。

深度优先遍历(DFS)

深度优先遍历包括前序遍历、中序遍历和后序遍历。以二叉树为例,节点定义如下:

class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;
    TreeNode(int x) { val = x; }
}

前序遍历(根-左-右)

递归实现:

void preOrderTraversal(TreeNode root) {
    if (root == null) return;
    System.out.println(root.val);
    preOrderTraversal(root.left);
    preOrderTraversal(root.right);
}

迭代实现(使用栈):

void preOrderTraversal(TreeNode root) {
    if (root == null) return;
    Stack<TreeNode> stack = new Stack<>();
    stack.push(root);
    while (!stack.isEmpty()) {
        TreeNode node = stack.pop();
        System.out.println(node.val);
        if (node.right != null) stack.push(node.right);
        if (node.left != null) stack.push(node.left);
    }
}

中序遍历(左-根-右)

递归实现:

void inOrderTraversal(TreeNode root) {
    if (root == null) return;
    inOrderTraversal(root.left);
    System.out.println(root.val);
    inOrderTraversal(root.right);
}

迭代实现:

void inOrderTraversal(TreeNode root) {
    Stack<TreeNode> stack = new Stack<>();
    TreeNode curr = root;
    while (curr != null || !stack.isEmpty()) {
        while (curr != null) {
            stack.push(curr);
            curr = curr.left;
        }
        curr = stack.pop();
        System.out.println(curr.val);
        curr = curr.right;
    }
}

后序遍历(左-右-根)

递归实现:

void postOrderTraversal(TreeNode root) {
    if (root == null) return;
    postOrderTraversal(root.left);
    postOrderTraversal(root.right);
    System.out.println(root.val);
}

迭代实现:

void postOrderTraversal(TreeNode root) {
    if (root == null) return;
    Stack<TreeNode> stack = new Stack<>();
    Stack<Integer> result = new Stack<>();
    stack.push(root);
    while (!stack.isEmpty()) {
        TreeNode node = stack.pop();
        result.push(node.val);
        if (node.left != null) stack.push(node.left);
        if (node.right != null) stack.push(node.right);
    }
    while (!result.isEmpty()) {
        System.out.println(result.pop());
    }
}

广度优先遍历(BFS)

广度优先遍历通常使用队列实现,按层次遍历树的节点。

void levelOrderTraversal(TreeNode root) {
    if (root == null) return;
    Queue<TreeNode> queue = new LinkedList<>();
    queue.offer(root);
    while (!queue.isEmpty()) {
        TreeNode node = queue.poll();
        System.out.println(node.val);
        if (node.left != null) queue.offer(node.left);
        if (node.right != null) queue.offer(node.right);
    }
}

通用树遍历

对于多叉树(每个节点可能有多个子节点),可以使用类似的方法。节点定义如下:

class TreeNode {
    int val;
    List<TreeNode> children;
    TreeNode(int x) { val = x; children = new ArrayList<>(); }
}

前序遍历

递归实现:

void preOrderTraversal(TreeNode root) {
    if (root == null) return;
    System.out.println(root.val);
    for (TreeNode child : root.children) {
        preOrderTraversal(child);
    }
}

后序遍历

递归实现:

java如何遍历树

void postOrderTraversal(TreeNode root) {
    if (root == null) return;
    for (TreeNode child : root.children) {
        postOrderTraversal(child);
    }
    System.out.println(root.val);
}

广度优先遍历

void levelOrderTraversal(TreeNode root) {
    if (root == null) return;
    Queue<TreeNode> queue = new LinkedList<>();
    queue.offer(root);
    while (!queue.isEmpty()) {
        TreeNode node = queue.poll();
        System.out.println(node.val);
        for (TreeNode child : node.children) {
            queue.offer(child);
        }
    }
}

以上方法覆盖了常见的树遍历需求,可以根据具体场景选择合适的遍历方式。

标签: 遍历java
分享给朋友:

相关文章

如何学习java

如何学习java

学习Java的步骤 理解基础知识 从Java的基本语法开始,包括变量、数据类型、运算符、控制流(if-else、循环)等。掌握这些基础概念是后续学习的基石。 学习面向对象编程(OOP) Java是一…

java如何输入数据

java如何输入数据

输入数据的方法 在Java中,输入数据可以通过多种方式实现,具体取决于输入来源(如控制台、文件、网络等)。以下是几种常见的方法: 使用Scanner类从控制台输入 Scanner类是Java中最常用…

如何学好java

如何学好java

理解基础概念 掌握Java的核心概念是学习的基础。包括数据类型、变量、运算符、控制流(如循环和条件语句)、数组等。理解面向对象编程(OOP)的四大特性:封装、继承、多态和抽象。 实践编程练习 通过实…

java如何遍历数组

java如何遍历数组

遍历数组的方法 Java中遍历数组有多种方式,以下是常见的几种方法: 使用for循环 通过索引逐个访问数组元素: int[] array = {1, 2, 3, 4, 5}; for (int i…

java如何调试

java如何调试

调试Java程序的基本方法 使用IDE内置的调试工具(如IntelliJ IDEA或Eclipse)是最常见的方式。在代码行号旁点击设置断点,启动调试模式后,程序会在断点处暂停,允许查看变量值、调用栈…

如何导入java项目

如何导入java项目

导入Java项目的方法 使用IDE导入(如IntelliJ IDEA或Eclipse) 打开IDE后选择导入现有项目,导航至项目根目录(包含pom.xml或build.gradle的文件位置)。IDE…