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

yizhihongxing

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日

相关文章

  • 苹果 iOS 15.5/ iPadOS 15.5 开发者预览版 Beta 发布 (附更新内容大全)

    苹果 iOS 15.5/ iPadOS 15.5 开发者预览版 Beta 发布 (附更新内容大全)攻略 近日,苹果公司发布了 iOS 15.5/ iPadOS 15.5 开发者预览版 Beta,本篇攻略将会详细讲解这个更新内容的大全。 更新内容 以下是 iOS 15.5/ iPadOS 15.5 开发者预览版 Beta 的更新内容: 1. 网络中断问题修复 …

    other 2023年6月26日
    00
  • 在mac上安装office2016破解版

    在 Mac 上安装Office 2016破解版 Microsoft Office是一款非常常用的办公软件,但是它是商业软件,需要购买许可证。在 Mac 上安装Office 2016破解版可能会带来版权问题,因此我们不推荐这么做。但如果您真的非常需要,以下是一种可能的安装步骤。 步骤一:卸载官方版Office 在安装破解版之前,需要先卸载您当前已经安装的官方版…

    其他 2023年3月29日
    00
  • Android 自定义组件卫星菜单的实现

    请听我讲解「Android 自定义组件卫星菜单的实现」的完整攻略。 简介 卫星菜单是一种圆形的菜单,在主菜单的周围分布着若干个子菜单图标,点击主菜单,子菜单就会从圆形菜单中弹出显示,用户可以点击子菜单图标进行操作。本攻略旨在教你如何使用 Android 自定义组件实现一个卫星菜单。 实现步骤 1. 创建项目和布局文件 首先创建一个 Android 项目,然后…

    other 2023年6月25日
    00
  • win10正式版官方原版完整镜像下载地址汇总

    Win10正式版官方原版完整镜像下载地址汇总攻略 Win10正式版官方原版完整镜像是指微软官方发布的未经修改的Windows 10操作系统镜像文件。以下是详细的攻略,包含两个示例说明。 步骤一:了解镜像版本 在开始下载之前,首先需要了解不同版本的Win10镜像。微软通常会发布多个版本,如家庭版、专业版、教育版等。根据自己的需求选择合适的版本。 步骤二:访问微…

    other 2023年8月4日
    00
  • 【HEVC简介】CTU、CU、PU、TU结构

    下面是关于HEVC中CTU、CU、PU、TU结构的详细讲解,包括基本概念、结构特点、使用流程和两个示例等方面。 基本概念 HEVC(High Efficiency Video Coding)是一种高效的视频编码标准,它采用了一种新的编码结构,即CTU、CU、PU、TU结构。其中,CTU(Coding Tree Unit)是最大的编码单元,CU(Coding …

    other 2023年5月6日
    00
  • Kotlin开发中open关键字与类名函数名和变量名的使用方法浅析

    Kotlin开发中open关键字与类名函数名和变量名的使用方法浅析 在Kotlin开发过程中,open关键字、类名、函数名和变量名的使用是非常重要的。本文将从三个方面对这些内容进行分别讲解。 open关键字的使用方法 在Kotlin中,open关键字用于修饰类、函数和属性。被修饰的类、函数和属性可以在其他类中继承或复用。其语法格式为: open class …

    other 2023年6月27日
    00
  • vue 封装一个高质量的表单通用组件

    下面是关于“vue 封装一个高质量的表单通用组件”的完整攻略: 第一步:明确需求 在开始开发之前,我们需要明确这个通用表单组件的使用场景以及需求。假设这个组件需要支持以下功能: 对表单进行校验,确保用户填写的信息符合要求; 实现一些自定义的表单项,例如日期选择器、下拉框等; 构建方便、易于维护的表单结构; 显示错误信息和成功提示信息,使用户有良好的交互体验。…

    other 2023年6月25日
    00
  • 浏览器访问ipv6站点(未绑定主机的ipv6站点)

    浏览器访问ipv6站点(未绑定主机的ipv6站点) 随着互联网的飞速发展,IPv6技术越来越成为网络发展的重要组成部分。IPv6的地址空间更加庞大,解决了IPv4地址不足的问题。但是在实际应用中,我们会发现有不少站点并没有进行IPv6主机绑定,导致无法直接访问。那么如何利用浏览器访问这些未绑定主机的IPv6站点呢? 1. 理解未绑定主机的IPv6站点 在IP…

    其他 2023年3月28日
    00
合作推广
合作推广
分享本页
返回顶部