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

Java二叉树的四种遍历

二叉树是一种非常常用的数据结构,在算法和数据结构中有广泛的应用。对于二叉树的操作,最常用的就是遍历。在Java中,我们可以使用递归和非递归两种方式来进行遍历。本文将详细讲解Java二叉树的四种遍历方式:前序遍历、中序遍历、后序遍历和层次遍历。

二叉树的定义

二叉树是每个节点最多有两个子树的树结构,通常被用于实现二叉查找树和二叉堆。二叉树有五种遍历方式:前序遍历、中序遍历、后序遍历、层次遍历和倒序遍历。

二叉树的三种遍历方式

前序遍历

前序遍历顺序为:根节点 -> 左子树 -> 右子树。对于前序遍历,递归和非递归两种方式都十分容易实现。以下是递归和非递归实现前序遍历的示例代码:

// 递归实现前序遍历
public void preOrderTraversal(TreeNode root){
    if(root == null){
        return;
    }
    System.out.print(root.val + " ");
    preOrderTraversal(root.left);
    preOrderTraversal(root.right);
}

// 非递归实现前序遍历
public void preOrderTraversal(TreeNode root){
    Stack<TreeNode> stack = new Stack<>();
    while(root != null || !stack.isEmpty()){
        while(root != null){
            stack.push(root);
            System.out.print(root.val + " ");
            root = root.left;
        }
        if(!stack.isEmpty()){
            root = stack.pop();
            root = root.right;
        }
    }
}

中序遍历

中序遍历顺序为:左子树 -> 根节点 -> 右子树。对于中序遍历,递归和非递归两种方式都十分容易实现。以下是递归和非递归实现中序遍历的示例代码:

// 递归实现中序遍历
public void inOrderTraversal(TreeNode root){
    if(root == null){
        return;
    }
    inOrderTraversal(root.left);
    System.out.print(root.val + " ");
    inOrderTraversal(root.right);
}

// 非递归实现中序遍历
public void inOrderTraversal(TreeNode root){
    Stack<TreeNode> stack = new Stack<>();
    while(root != null || !stack.isEmpty()){
        while(root != null){
            stack.push(root);
            root = root.left;
        }
        if(!stack.isEmpty()){
            root = stack.pop();
            System.out.print(root.val + " ");
            root = root.right;
        }
    }
}

后序遍历

后序遍历顺序为:左子树 -> 右子树 -> 根节点。对于后序遍历,递归和非递归两种方式都比较复杂,需要用到其他数据结构。以下是递归和非递归实现后序遍历的示例代码:

// 递归实现后序遍历
public void postOrderTraversal(TreeNode root){
    if(root == null){
        return;
    }
    postOrderTraversal(root.left);
    postOrderTraversal(root.right);
    System.out.print(root.val + " ");
}

// 非递归实现后序遍历
public void postOrderTraversal(TreeNode root){
    Stack<TreeNode> stack = new Stack<>();
    TreeNode prev = null;
    while(root != null || !stack.isEmpty()){
        while(root != null){
            stack.push(root);
            root = root.left;
        }
        root = stack.pop();
        if(root.right == null || root.right == prev){
            System.out.print(root.val + " ");
            prev = root;
            root = null;
        } else {
            stack.push(root);
            root = root.right;
        }
    }
}

层次遍历

层次遍历顺序为:从根节点开始,按照从上到下、从左到右的顺序遍历所有节点。层次遍历需要借助辅助队列来实现,以下是层次遍历的示例代码:

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

总结

本文讲解了Java二叉树的四种遍历方式:前序遍历、中序遍历、后序遍历和层次遍历。其中,前序遍历和中序遍历可以使用递归和非递归两种方式进行遍历,而后序遍历和层次遍历需要使用辅助数据结构来实现。对于数据结构和算法的学习,遍历二叉树是基础,建议大家多进行实践和练习。

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

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

相关文章

  • webrtc学习———记录三:mediastreamtrack

    WebRTC学习——记录三:MediaStreamTrack的完整攻略 MediaStreamTrack是WebRTC中的一个重要概念,它代表了一个媒体流中的一个轨道,例如音频或视频轨道。在Web中,可以使用MediaStreamTrack来控制媒体流的输入和输出,以及对媒体流进行处理和操作。本文将介绍MediaStreamTrack完整攻略,包括定义、属性…

    other 2023年5月9日
    00
  • javascript 混合的构造函数和原型方式,动态原型方式

    JavaScript混合的构造函数和原型方式 在JavaScript中,有多种方式来创建对象和定义对象的方法。其中两种常见的方式是混合的构造函数和原型方式以及动态原型方式。 混合的构造函数和原型方式 混合的构造函数和原型方式是一种常见的对象创建方式,它结合了构造函数和原型的特点。通过构造函数创建对象的属性,而通过原型创建对象的方法。 下面是一个示例: // …

    other 2023年8月6日
    00
  • 浅谈C++ 基类指针和子类指针的相互赋值

    C++ 中的继承机制允许子类从其父类中继承数据和方法。在使用继承时,我们需要了解基类指针和子类指针的概念,以及它们之间的相互赋值的方法。 基类指针和子类指针的定义 基类指针:指向基类对象的指针,可以指向基类对象本身,也可以指向其派生类的对象。例如: “`c++ class Base { public: virtual void print() { cout…

    other 2023年6月26日
    00
  • Python教程之pytest命令行方式运行用例

    Python教程之pytest命令行方式运行用例 什么是pytest pytest是Python中一个全功能的测试框架。它能够使得测试变得简单易用、可读性强。pytest支持不同范围测试(单元测试、功能测试等),使用起来也比较容易。 安装pytest 在安装pytest前,需要保证已经安装了python。 安装pytest的方式有多种,这里介绍最常用的几种:…

    other 2023年6月27日
    00
  • .Net报表开发控件XtraReport介绍

    .Net报表开发控件XtraReport介绍 什么是XtraReport XtraReport是DevExpress公司提供的一种报表开发控件,它可以在Winform、WPF及ASP.NET应用程序中使用,该控件还提供了大量的报表设计器工具,方便用户定制自己的报表风格。 使用XtraReport 1. 导入控件库 在使用XtraReport前,我们需要导入D…

    other 2023年6月27日
    00
  • rabbitmq彻底卸载

    RabbitMQ彻底卸载 RabbitMQ是一个开源的消息队列系统,可以用来实现分布式应用程序之间的消息传递。虽然RabbitMQ使用简单且可靠,但在某些情况下,你可能需要彻底卸载它。本文将介绍如何在Windows和Linux操作系统上彻底卸载RabbitMQ。 Windows下卸载RabbitMQ 停止RabbitMQ服务 在开始卸载RabbitMQ之前,…

    其他 2023年3月28日
    00
  • redhatenterpriselinux8.0安装

    Red Hat Enterprise Linux 8.0 安装 Red Hat Enterprise Linux (RHEL) 是一款商业化的 Linux 操作系统。本文章将详细介绍 Red Hat Enterprise Linux 8.0 的安装步骤。 下载 Red Hat Enterprise Linux 8.0 首先,需要从 Red Hat 官网下载 …

    其他 2023年3月28日
    00
  • react使用.env文件管理全局变量的方法

    React是一个非常流行的JavaScript库,它可以帮助开发者快速构建高度动态的用户界面。React的一个重要特点是能够轻松地和其他库和工具集成,这使得开发者可以更方便地编写和管理代码。其中,使用.env文件管理全局变量是react中很常用的一个方法。 1. 建立.env文件 在你的React项目根目录下,创建一个名为.env的文件。这个文件包含了你需要…

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