JAVA二叉树的几种遍历(递归,非递归)实现

JAVA二叉树的几种遍历(递归,非递归)实现

二叉树(Binary Tree)是非常重要的数据结构之一,Java中也提供了各种各样的二叉树实现方式。在学习Java的二叉树时,了解二叉树的三种遍历方式非常必要,包括前序遍历、中序遍历和后序遍历。

二叉树遍历

对于二叉树的遍历方式,可以简单地分为两类:深度优先遍历(Depth-First Traversal),广度优先遍历(Breadth-First Traversal)。其中深度遍历可以进一步细分为前序遍历、中序遍历和后序遍历,广度优先遍历又叫做层次遍历。

前序遍历

前序遍历,顾名思义就是指从根节点开始,每次先遍历节点本身,再遍历左右子树。具体实现可参考代码示例1。

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

中序遍历

中序遍历,就是指从根节点开始,先遍历左子树,然后遍历根节点本身,最后遍历右子树。具体实现可参考代码示例2。

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

后序遍历

后序遍历,就是指从根节点开始,先遍历左右子树,最后遍历根节点本身。具体实现可参考代码示例3。

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

非递归遍历

上面的代码是采用递归方式实现的二叉树遍历,但是在实际开发中,递归方式也许并不是最优解。为了避免递归带来的栈溢出等问题,可以采用非递归方式遍历二叉树。具体实现方式可参考代码示例4、5和6。

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

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

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

代码示例

代码示例1

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

代码示例2

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

代码示例3

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

代码示例4

public static void preOrderTraversal2(TreeNode root) {
    Stack<TreeNode> stack = new Stack<>();
    TreeNode cur = root;
    while (cur != null || !stack.isEmpty()) {
        while (cur != null) {
            System.out.print(cur.val + " ");
            stack.push(cur);
            cur = cur.left;
        }
        cur = stack.pop();
        cur = cur.right;
    }
}

代码示例5

public static void inOrderTraversal2(TreeNode root) {
    Stack<TreeNode> stack = new Stack<>();
    TreeNode cur = root;
    while (cur != null || !stack.isEmpty()) {
        while (cur != null) {
            stack.push(cur);
            cur = cur.left;
        }
        cur = stack.pop();
        System.out.print(cur.val + " ");
        cur = cur.right;
    }
}

代码示例6

public static void postOrderTraversal2(TreeNode root) {
    Stack<TreeNode> stack1 = new Stack<>();
    Stack<TreeNode> stack2 = new Stack<>();
    TreeNode cur = root;
    stack1.push(cur);
    while (!stack1.isEmpty()) {
        cur = stack1.pop();
        stack2.push(cur);
        if (cur.left != null) {
            stack1.push(cur.left);
        }
        if (cur.right != null) {
            stack1.push(cur.right);
        }
    }
    while (!stack2.isEmpty()) {
        System.out.print(stack2.pop().val + " ");
    }
}

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

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

相关文章

  • 0基础入门学习Python(第3章)

    下面是关于0基础入门学习Python第3章的完整攻略,包括环境搭建、代码编写和两个示例说明。 环境搭建 下载安装Python: 首先,需要从Python官网下载并安装Python。安装过程中,选择添加Python到系统环境变量。 安装IDE: 可以选择安装PyCharm或者其他Python IDE,用于编写和运行Python代码。 代码编写 变量: 在Pyt…

    other 2023年5月6日
    00
  • JS获取本机IP地址的2种方法

    JS获取本机IP地址的2种方法 在JavaScript中,有多种方法可以获取本机的IP地址。下面将介绍两种常用的方法,并提供示例说明。 方法一:使用WebRTC API WebRTC(Web实时通信)是一种现代的浏览器API,可以用于实现实时音视频通信。通过WebRTC API,我们可以获取本机的IP地址。 // 创建一个RTCPeerConnection对…

    other 2023年7月29日
    00
  • linux命令行模式下实现代理上网(转)

    Linux命令行模式下实现代理上网(转) 在进行网络访问时,有时需要使用代理来突破网络限制。但是,如果是在Linux命令行下工作,就需要了解如何设置代理来进行网络访问。本文将介绍Linux命令行模式下如何使用代理,并给出具体的操作步骤。 安装并配置代理 首先,需要安装一个代理工具。我们以Shadowsocks为例,这是一个使用密码和端口的快速代理工具。在Ub…

    其他 2023年3月28日
    00
  • Android中View自定义组合控件的基本编写方法

    当我们需要实现某种特定的功能,而已有的控件无法满足时,我们就需要用到View自定义组合控件。下面是一些基本的编写方法: 第一步:创建一个新的类,继承自ViewGroup 一个ViewGroup是多个View的容器,它可以包含其他的View或ViewGroup,如LinearLayout、RelativeLayout等。如果我们要实现一个新的组合控件,那么我们…

    other 2023年6月25日
    00
  • apk是什么文件格式?.apk文件怎么打开?

    APK是什么文件格式? APK是Android应用程序包(Android Package)的缩写,它是一种用于在Android操作系统上安装和分发应用程序的文件格式。APK文件实际上是一个压缩文件,其中包含了应用程序的所有组件和资源,如代码、图像、音频和视频等。 .APK文件怎么打开? 要打开APK文件,您可以按照以下步骤进行操作: 使用Android设备打…

    other 2023年8月6日
    00
  • iOS10推送通知开发教程

    iOS10推送通知开发教程 1. 概述 推送通知是iOS应用中一种重要的功能,它可以让应用在后台或锁屏状态下向用户发送通知消息。本教程将详细介绍如何在iOS10中进行推送通知的开发。 2. 准备工作 在开始开发之前,你需要准备以下内容:- 一台Mac电脑- 最新版本的Xcode开发环境- 有效的Apple开发者账号 3. 创建证书和配置推送服务 在进行推送通…

    other 2023年6月28日
    00
  • pyQT5 实现窗体之间传值的示例

    下面我将为您详细讲解“PyQt5 实现窗体之间传值的示例”的完整攻略。在这个过程中,我将会使用两条示例来说明具体实现方法,帮助您更好地理解。 步骤一:创建两个窗口类 首先,我们需要创建两个窗口类,也就是两个 PyQt5 的窗口对象。可以使用 Qt Designer 工具来创建窗口的界面,然后用 PyQt5 中的 uic 模块加载该界面文件。下面是一个简单的用…

    other 2023年6月27日
    00
  • 填坑!线上Presto查询Hudi表异常排查

    填坑!线上Presto查询Hudi表异常排查的完整攻略 Presto是一种分布式SQL查询引擎,可以查询多种数据源,包括Hudi表。但是,在线上查询Hudi表时,可能会遇到各种异常。本文将介绍如何排查在线上Presto查询Hudi表时遇到的异常。 1. 确认Hudi表是否存在 在查询Hudi表之前,需要确认Hudi表是否存在。可以使用Hudi提供的CLI工具…

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