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日

相关文章

  • linux mount命令的用法详细解析

    Linux mount命令的用法详细解析 在 Linux 系统中,mount 命令最为常用和实用,它是将一个存储设备(如磁盘分区、U盘等)挂载到系统中的指定目录下使用的命令。本文将详细讲解 mount 命令的用法,以及如何挂载和卸载存储设备。 语法格式 mount的语法格式如下: mount [-fnrsvw] [-t<类型>] [-o<选…

    other 2023年6月27日
    00
  • Nginx配置之location的匹配优先级浅析

    Nginx配置之location的匹配优先级浅析 1. 什么是Nginx的location指令 在Nginx的配置文件中,location指令用于匹配URL,并指定相应的处理方式。我们可以根据location指令来配置Nginx对特定URL的处理方式,包括转发请求到后端服务器、返回固定内容等。 2. location的匹配优先级 Nginx的location…

    other 2023年6月28日
    00
  • SQL Server 树形表非循环递归查询的实例详解

    SQL Server 树形表非循环递归查询的实例详解 在SQL Server中,有很多采用树的结构进行存储和组织的数据,例如菜单树、部门树、地区树等等。根据需要,我们可能需要对这些数据进行展示和分析,比如在网站中展示一个多级的菜单树,或者生成一份组织结构图。在这种情况下,我们需要进行一个树形表的非循环递归查询。 什么是树形表 树形表是一种采用递归关系来描述数…

    other 2023年6月27日
    00
  • 安卓 获取手机IP地址的实现代码

    获取安卓手机的IP地址可以通过以下步骤实现: 添加网络权限:在AndroidManifest.xml文件中添加以下权限: <uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\" /> <uses-permission androi…

    other 2023年7月31日
    00
  • opencv-python小白笔记(16)

    以下是关于“OpenCV-Python小白笔记(16)”的完整攻略,包含两个示例。 OpenCV-Python小白笔记(16) OpenCV-Python是一个基于Python的开源计算机视觉库,可以用于图像处理、计算机视觉和机器学习等领域。以下是关于OpenCV-Python的一些小白笔记。 1. 读取和显示图像 我们可以使用OpenCV-Python读取…

    other 2023年5月9日
    00
  • 2018年3大UI设计趋势,你知道吗?

    2018年3大UI设计趋势,你知道吗? UI设计是一个不断变化的领域,每年都会有新的趋势和流行。作为网站的站长,我们需要紧跟时代,掌握最新的UI设计趋势,来提高用户体验,增强网站的竞争力。在2018年,以下三个UI设计趋势将会成为主流。 1. 扁平化设计进一步发展 扁平化设计是近年来最为流行的UI设计潮流之一,它强调简洁的界面设计,去除了过多的装饰和效果,使…

    其他 2023年3月28日
    00
  • softmax可以多分类吗

    softmax可以多分类吗? 当我们进行分类问题时,通常需要使用分类模型,对于二分类问题(如判断猫和狗),我们可以使用逻辑回归模型。但是,当涉及到多分类问题时,我们需要使用其他类型的模型。其中一种流行的模型是softmax回归模型。 在softmax回归模型中,我们使用的是一个softmax函数(也称归一化指数函数),它可以将一个实向量(也称得分)转换为概率…

    其他 2023年3月28日
    00
  • Android中ADB命令用法大结局

    Android中ADB命令用法大结局 ADB(Android Debug Bridge)是Android开发工具包(SDK)中的一个命令行工具,用于与连接的Android设备进行通信和调试。以下是ADB的常见用法及示例说明: 安装应用程序: adb install app.apk 该命令用于将应用程序安装到连接的Android设备上。 卸载应用程序: adb…

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