Java实现二叉树的深度优先遍历和广度优先遍历算法示例

针对“Java实现二叉树的深度优先遍历和广度优先遍历算法示例”的题目,下面给出完整的攻略。

什么是二叉树深度优先遍历和广度优先遍历

在学习Java实现二叉树深度优先遍历和广度优先遍历之前,我们需要先了解什么是二叉树深度优先遍历和广度优先遍历。

二叉树深度优先遍历是先访问根节点,再遍历左子树,最后再遍历右子树。而广度优先遍历则是一层一层地访问树节点,即先访问第一层,在访问第二层,直到所有的节点都被访问。

二叉树深度优先遍历

深度优先遍历有三种方式:前序遍历、中序遍历和后序遍历。

1.前序遍历

前序遍历的步骤是:

1.访问根节点
2.遍历左子树
3.遍历右子树

实现示例:

class Node {  
    int val;  
    Node left;  
    Node right;  

    public Node(int val) {  
        this.val = val;  
    }  
}  
public class BinaryTree {  
    //前序遍历  
    public static void preOrder(Node root) {  
        if (root != null) {  
            System.out.println(root.val);  
            preOrder(root.left);  
            preOrder(root.right);  
        }  
    }  

    public static void main(String[] args) {  
        Node node1 = new Node(1);  
        Node node2 = new Node(2);  
        Node node3 = new Node(3);  
        Node node4 = new Node(4);  
        Node node5 = new Node(5);  
        Node node6 = new Node(6);  
        Node node7 = new Node(7);  
        Node node8 = new Node(8);  
        node1.left = node2;  
        node1.right = node3;  
        node2.left = node4;  
        node3.left = node5;  
        node3.right = node6;  
        node4.right = node7;  
        node5.left = node8;  
        preOrder(node1);  
    }  
} 

2.中序遍历

中序遍历的步骤是:

1.遍历左子树
2.访问根节点
3.遍历右子树

实现示例:

class Node {  
    int val;  
    Node left;  
    Node right;  

    public Node(int val) {  
        this.val = val;  
    }  
}  
public class BinaryTree {  
    //中序遍历  
    public static void inOrder(Node root) {  
        if (root != null) {  
            inOrder(root.left);  
            System.out.println(root.val);  
            inOrder(root.right);  
        }  
    }  

    public static void main(String[] args) {  
        Node node1 = new Node(1);  
        Node node2 = new Node(2);  
        Node node3 = new Node(3);  
        Node node4 = new Node(4);  
        Node node5 = new Node(5);  
        Node node6 = new Node(6);  
        Node node7 = new Node(7);  
        Node node8 = new Node(8);  
        node1.left = node2;  
        node1.right = node3;  
        node2.left = node4;  
        node3.left = node5;  
        node3.right = node6;  
        node4.right = node7;  
        node5.left = node8;  
        inOrder(node1);  
    }  
}

3.后序遍历

后序遍历的步骤是:

1.遍历左子树
2.遍历右子树
3.访问根节点

实现示例:

class Node {  
    int val;  
    Node left;  
    Node right;  

    public Node(int val) {  
        this.val = val;  
    }  
}  
public class BinaryTree {  
    //后序遍历  
    public static void postOrder(Node root) {  
        if (root != null) {  
            postOrder(root.left);  
            postOrder(root.right);  
            System.out.println(root.val);  
        }  
    }  

    public static void main(String[] args) {  
        Node node1 = new Node(1);  
        Node node2 = new Node(2);  
        Node node3 = new Node(3);  
        Node node4 = new Node(4);  
        Node node5 = new Node(5);  
        Node node6 = new Node(6);  
        Node node7 = new Node(7);  
        Node node8 = new Node(8);  
        node1.left = node2;  
        node1.right = node3;  
        node2.left = node4;  
        node3.left = node5;  
        node3.right = node6;  
        node4.right = node7;  
        node5.left = node8;  
        postOrder(node1);  
    } 
}

二叉树广度优先遍历

广度优先遍历可以使用队列来实现。

实现示例:

import java.util.LinkedList;  
import java.util.Queue;  
class Node {  
    int val;  
    Node left;  
    Node right;  

    public Node(int val) {  
        this.val = val;  
    }  
}  
public class BinaryTree {  
    //广度优先遍历  
    public static void bfs(Node root) {  
        if (root == null) {  
            return;  
        }  
        Queue<Node> queue = new LinkedList<Node>();  
        queue.offer(root);  
        while (!queue.isEmpty()) {  
            Node node = queue.poll();  
            System.out.println(node.val);  
            if (node.left != null) {  
                queue.offer(node.left);  
            }  
            if (node.right != null) {  
                queue.offer(node.right);  
            }  
        }  
    }  

    public static void main(String[] args) {  
        Node node1 = new Node(1);  
        Node node2 = new Node(2);  
        Node node3 = new Node(3);  
        Node node4 = new Node(4);  
        Node node5 = new Node(5);  
        Node node6 = new Node(6);  
        Node node7 = new Node(7);  
        Node node8 = new Node(8);  
        node1.left = node2;  
        node1.right = node3;  
        node2.left = node4;  
        node3.left = node5;  
        node3.right = node6;  
        node4.right = node7;  
        node5.left = node8;  
        bfs(node1);  
    }  
}

通过上面给出的Java实现二叉树深度优先遍历和广度优先遍历算法示例,你已经能够学会如何实现这两种二叉树遍历方式了。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java实现二叉树的深度优先遍历和广度优先遍历算法示例 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • PHP一些有意思的小区别

    当我们在使用PHP进行开发的时候,可能会遇到一些有趣的小区别,这些小区别可能不会影响代码的运行,但是了解这些区别可以让我们更全面地理解PHP语言。下面是一些例子: 单引号和双引号 在PHP中,单引号和双引号用于定义字符串,二者有所不同。单引号中的文本会被原样输出,而双引号中的文本会被解析并替换掉其中的变量。例如: $name = "Tom&quot…

    Java 2023年6月15日
    00
  • 关于SpringBoot中controller参数校验的使用

    对于SpringBoot中的参数校验,我们可以使用JSR-303规范提供的注解对Controller层的方法参数进行校验。具体实现方式如下: 引入依赖 首先需要引入spring-boot-starter-validation依赖,可以在pom.xml文件中添加以下依赖: <dependency> <groupId>org.spring…

    Java 2023年5月20日
    00
  • Spring Security实现禁止用户重复登陆的配置原理

    要实现禁止用户重复登录的功能,可以使用Spring Security提供的会话管理机制。具体步骤如下: 1.配置session并发管理 在Spring Security配置文件中,可以通过配置ConcurrentSessionControlAuthenticationStrategy实现并发会话控制。示例代码如下: <bean id="ses…

    Java 2023年5月20日
    00
  • Java实现redis分布式锁的三种方式

    Java实现redis分布式锁的三种方式 在分布式系统中,实现分布式锁是很重要的一个需求。Redis作为一个内存数据库,具有高性能、高可用、操作简便等优点,因此被广泛应用于实现分布式锁。 本文将介绍Java实现redis分布式锁的三种方式:使用Redis的setnx命令、使用Lua脚本实现乐观锁、使用Redisson(一个流行的Redis客户端)实现分布式锁…

    Java 2023年5月20日
    00
  • Servlet返回的数据js解析2种方法

    下面是关于Servlet返回的数据js解析2种方法的完整攻略: 方法一:直接使用返回的数据 Servlet返回的数据可以是任意格式的数据,比如JSON、XML或普通的字符串格式等等。如果返回的是JSON格式的数据,我们可以在前端利用JS原生的JSON.parse()方法将其转化成JS对象。例如下面的示例: // 假设这是从Servlet返回的JSON格式的数…

    Java 2023年6月15日
    00
  • 在JSTL EL中处理java.util.Map,及嵌套List的情况

    在JSTL EL中处理java.util.Map和嵌套List的情况,我们可以使用JSTL EL的语法来访问Map和List中的元素。以下是处理这些情况的完整攻略: 处理java.util.Map 使用<c:forEach>标签迭代Map中的元素,并可以使用<c:out>标签输出Map中的元素值。以下是示例代码: <c:forE…

    Java 2023年6月15日
    00
  • Spring五大类注解读取存储Bean对象的方法

    下面是详细的讲解“Spring五大类注解读取存储Bean对象的方法”的完整攻略。 一、概述 Spring 是一种非常受欢迎的 Java 开发框架,它提供了一套非常完整的依赖注入机制,使得开发者可以轻松地使用 Spring 来管理 Bean 对象。而 Spring 的 Bean 对象的创建方式就有五大类注解方式,它们分别是:@Component、@Reposi…

    Java 2023年5月26日
    00
  • 简单了解Java位域的一些知识

    简单了解Java位域的一些知识 Java中的位域是一种内存优化技术,可以在一个变量中存储多个布尔值,以节省内存空间。本文将介绍Java位域的基本知识,包括如何使用位运算符来设置和获取位值,以及如何在Java中使用位域。 什么是Java位域? Java位域是一种数据结构,用于在单个变量中存储多个布尔值。它可以通过位运算符来实现。在Java的位域中,每个布尔值使…

    Java 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部