Java二叉树的四种遍历(递归与非递归)

Java二叉树的四种遍历(递归与非递归)

简介

二叉树是一种常见的数据结构,其遍历方式包括前序遍历、中序遍历、后序遍历和层序遍历。Java中可以使用递归和非递归的方式进行遍历。在该攻略中,我们将详细介绍Java二叉树的四种遍历方式,包括递归和非递归实现,帮助读者提高对Java数据结构的理解。

前序遍历

在前序遍历中,我们先访问二叉树的根节点,然后分别访问左子树和右子树。在Java中,我们可以使用递归和非递归的方式实现前序遍历。

递归实现

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

非递归实现

public 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);
        }
    }
}

中序遍历

在中序遍历中,我们先访问二叉树的左子树,然后访问根节点,最后再访问右子树。同样地,在Java中我们也可以使用递归和非递归的方式实现中序遍历。

递归实现

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

非递归实现

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

后序遍历

在后序遍历中,我们先访问二叉树的左子树,然后访问右子树,最后再访问根节点。同样地,在Java中我们也可以使用递归和非递归的方式实现后序遍历。

递归实现

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

非递归实现

public void postOrderTraversal(TreeNode root){
    if(root == null){
        return;
    }
    Stack<TreeNode> stack = new Stack<>();
    stack.push(root);
    TreeNode prev = null;
    while(!stack.isEmpty()){
        TreeNode curr = stack.peek();
        if(prev == null || prev.left == curr || prev.right == curr){
            if(curr.left!=null){
                stack.push(curr.left);
            }else if(curr.right!=null){
                stack.push(curr.right);
            }
        }else if(curr.left == prev){
            if(curr.right!=null){
                stack.push(curr.right);
            }
        }else{
            System.out.println(curr.val);
            stack.pop();
        }
        prev = curr;
    } 
}

层序遍历

在层序遍历中,我们按照从上到下、从左到右的顺序访问二叉树的每个节点。同样地,在Java中我们也可以使用队列的非递归方式实现层序遍历。

非递归实现

public void levelOrderTraversal(TreeNode root){
    if(root == null){
        return;
    }
    Queue<TreeNode> queue = new LinkedList<>();
    queue.offer(root);
    while(!queue.isEmpty()){
        int levelSize = queue.size();
        for(int i=0;i<levelSize;i++){
            TreeNode curr = queue.poll();
            System.out.println(curr.val);
            if(curr.left!=null){
                queue.offer(curr.left);
            }
            if(curr.right!=null){
                queue.offer(curr.right);
            }
        }
    } 
}

示例说明

以下为一个简单的二叉树:

       1
     /   \
    2     3
   / \
  4   5

前序遍历

递归:1 2 4 5 3

非递归:1 2 4 5 3

中序遍历

递归:4 2 5 1 3

非递归:4 2 5 1 3

后序遍历

递归:4 5 2 3 1

非递归:4 5 2 3 1

层序遍历

1 2 3 4 5

以上是Java二叉树的四种遍历方式及其实现。希望能够帮助读者更好地掌握Java的数据结构,提高代码能力。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java二叉树的四种遍历(递归与非递归) - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • Azure Internet 负载均衡器建立

    Azure Internet 负载均衡器建立的完整攻略 Azure Internet 负载均衡器是一种基于云的负载均衡解决方案,可以将流量分配到多个虚拟机实例或虚拟机规模集中。本文将为您提供 Azure Internet 负载均衡器建立的完整攻略,包括以下内容: 创建 Azure 负载均衡器 创建后端池 创建负载均衡规则 示例说明 1. 创建 Azure 负…

    other 2023年5月5日
    00
  • nuxt.js 多环境变量配置

    下面是关于“Nuxt.js 多环境变量配置”的完整攻略: 什么是环境变量 在程序中,环境变量是通过操作系统提供的一种全局变量,在不同的运行环境中存储和使用不同的值。环境变量通常用于配置应用程序的不同方面或指导应用程序在不同的环境中的不同行为。 Nuxt.js 多环境变量配置攻略 以下是 Nuxt.js 多环境变量配置的完整攻略: 创建环境变量配置文件 Nux…

    other 2023年6月27日
    00
  • 浅谈Java中的atomic包实现原理及应用

    我们来详细讲解“浅谈Java中的atomic包实现原理及应用”的攻略。 简介 Java中的atomic包是一个提供原子操作的工具包,它可以保证多个线程之间执行指定的操作是原子性的,从而避免并发问题。在Java的高并发场景下,atomic包已经成为非常重要的工具包之一。 atomic包的实现原理 atomic包的实现原理是基于sun.misc.Unsafe类的…

    other 2023年6月26日
    00
  • 必学:电脑与网络维护常用技巧

    必学:电脑与网络维护常用技巧攻略 前言 在我们使用电脑和互联网的过程中,难免会遇到一些问题,如软件程序出现故障、网络连接质量糟糕等等。本文将介绍电脑与网络维护的一些常用技巧,帮助读者解决这些问题。 电脑维护技巧 清理垃圾文件 随着我们使用电脑的时间越来越长,系统中的临时文件、回收站的文件、浏览器历史记录等垃圾文件会越来越多。这些文件会占据硬盘空间,导致电脑变…

    other 2023年6月26日
    00
  • Mybatis中ResultMap解决属性名和数据库字段名不一致问题

    Mybatis中的ResultMap是用于解决属性名和数据库字段名不一致问题的重要工具。它允许我们自定义Java对象属性和数据库表字段之间的映射关系,并通过这种方式来解决名称不匹配的问题。下面是在Mybatis中使用ResultMap的步骤和示例。 第一步:定义ResultMap要定义一个ResultMap,可以在mapper.xml文件中使用<res…

    other 2023年6月25日
    00
  • Win11连接wifi频繁掉线怎么办 Win11网络不稳定的解决办法

    针对 Win11 连接 WIFI 频繁掉线和网络不稳定的问题,以下是详细攻略: 1. 关闭电脑和路由器的防火墙 有时,电脑和路由器的防火墙可能会阻止连接,导致 WIFI 频繁掉线。因此,我们可以尝试暂时关闭它们。 首先,我们需要关闭电脑的防火墙:在 Windows 系统中,打开“控制面板”>“系统和安全”>“Windows Defender 防火…

    other 2023年6月27日
    00
  • php解决跨域问题 你会用哪种方法

    以下是关于PHP解决跨域问题的完整攻略,包括跨域问题的定义、解决方法、示例说明和注意事项。 跨域问题的定义 跨域问题是指在开发中由于浏览器的同源策略限制,导致在一个域名下的网页无法直接访问另一个域名下的资源。例如,一个网页在http://www.example.com域名下,无法直接访http://www.anotherexample域名下的资源。 解决方法…

    other 2023年5月8日
    00
  • java 关键字super详解及用法

    Java 关键字super详解及用法 在 Java 编程中,我们经常会遇到需要在派生类中调用父类的方法或访问父类的属性的情况。这时就需要用到 Java 关键字 super。本文将详细讲解 Java 关键字 super 的用法及示例说明。 1. super 的作用 访问父类的属性 调用父类的方法 调用父类的构造方法 2. super 访问父类的属性 使用 su…

    other 2023年6月27日
    00
合作推广
合作推广
分享本页
返回顶部