Java实现的二叉树常用操作【前序建树,前中后递归非递归遍历及层序遍历】

下面是Java实现的二叉树常用操作的完整攻略:

前置知识

在学习本攻略之前,需要掌握以下基础知识:

  • Java的基本语法以及面向对象编程的理解
  • 二叉树的定义与性质

二叉树的定义

二叉树是一种树状结构,其中每个节点最多有两个子节点。二叉树的定义如下:

class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;
    TreeNode(int x) { val = x; }
}

每个节点都有一个值(val)和左右子节点(left, right),可以通过递归的方式定义一棵树。

前序建树

前序建树是指根据给定的前序遍历序列(preorder)构建一棵二叉树。前序遍历的顺序是:根节点 -> 左子树 -> 右子树。

前序建树的基本思路是:

  1. 先读取当前节点的值val
  2. 如果val为null,说明此处没有树节点,返回null
  3. 否则,新建节点,并将当前节点指向新节点
  4. 递归构建左子树
  5. 递归构建右子树

Java实现如下:

public static TreeNode buildTree(Scanner scanner) {
    int val = scanner.nextInt(); // 读取当前节点的值
    if (val == -1) { // 如果是-1,说明此处没有树节点,返回null
        return null;
    }
    TreeNode root = new TreeNode(val); // 否则,新建树节点
    root.left = buildTree(scanner); // 递归构建左子树
    root.right = buildTree(scanner); // 递归构建右子树
    return root;
}

示例1:假设给定一棵二叉树的前序遍历序列:1 2 -1 -1 3 4 -1 -1 5 -1 -1,其中-1表示无树节点,需要根据此序列构建一棵二叉树。在Java中调用如下:

Scanner scanner = new Scanner(System.in);
TreeNode root = buildTree(scanner);

示例2:假设给定一棵二叉树的前序遍历序列:5 6 -1 7 -1 -1 8 -1 -1,其中-1表示无树节点,需要根据此序列构建一棵二叉树。在Java中调用如下:

Scanner scanner = new Scanner(System.in);
TreeNode root = buildTree(scanner);

前中后递归遍历

前中后序遍历是二叉树最基本也是最常用的遍历方法。前序遍历的顺序是:根节点 -> 左子树 -> 右子树;中序遍历的顺序是:左子树 -> 根节点 -> 右子树;后序遍历的顺序是:左子树 -> 右子树 -> 根节点。

递归实现的基本思路是:

  1. 对于当前节点,先遍历它的左子树
  2. 然后遍历当前节点
  3. 最后遍历当前节点的右子树

Java实现如下:

public static void preorder(TreeNode root) { // 前序遍历
    if (root == null) { // 如果当前节点为null,返回
        return;
    }
    System.out.print(root.val + " "); // 遍历当前节点
    preorder(root.left); // 递归遍历左子树
    preorder(root.right); // 递归遍历右子树
}

public static void inorder(TreeNode root) { // 中序遍历
    if (root == null) { // 如果当前节点为null,返回
        return;
    }
    inorder(root.left); // 递归遍历左子树
    System.out.print(root.val + " "); // 遍历当前节点
    inorder(root.right); // 递归遍历右子树
}

public static void postorder(TreeNode root) { // 后序遍历
    if (root == null) { // 如果当前节点为null,返回
        return;
    }
    postorder(root.left); // 递归遍历左子树
    postorder(root.right); // 递归遍历右子树
    System.out.print(root.val + " "); // 遍历当前节点
}

示例1:假设给定一棵二叉树:

    1
   / \
  2   3
     / \
    4   5

前序遍历的输出结果为:1 2 3 4 5;中序遍历的输出结果为:2 1 4 3 5;后序遍历的输出结果为:2 4 5 3 1。在Java中调用如下:

preorder(root);
inorder(root);
postorder(root);

示例2:假设给定一棵二叉树:

     1
   /   \
  2     3
 / \   / \
4   5 6   7

前序遍历的输出结果为:1 2 4 5 3 6 7;中序遍历的输出结果为:4 2 5 1 6 3 7;后序遍历的输出结果为:4 5 2 6 7 3 1。在Java中调用如下:

preorder(root);
inorder(root);
postorder(root);

前中后非递归遍历

前中后序遍历可以使用非递归算法实现,非递归算法通常需要使用到栈。我们对于前序遍历进行非递归遍历的解析,中序遍历和后序遍历的实现方式类似。

前序遍历非递归实现基本思路是:

  1. 把根节点放到栈中
  2. 如果栈不为空,弹出栈顶元素,并遍历该节点
  3. 遍历完该节点后,先把右子树压栈,再把左子树压栈

Java实现如下:

public static void preorderNonRecursive(TreeNode root) { // 非递归前序遍历
    Stack<TreeNode> stack = new Stack<>();
    if (root != null) { // 如果不是空树,将根节点入栈
        stack.push(root);
    }
    while (!stack.isEmpty()) { // 栈不为空时循环
        TreeNode node = stack.pop(); // 取出栈顶元素
        System.out.print(node.val + " "); // 遍历当前节点
        if (node.right != null) { // 先把右子树入栈
            stack.push(node.right);
        }
        if (node.left != null) { // 再把左子树入栈
            stack.push(node.left);
        }
    }
}

示例1:假设给定一棵二叉树:

    1
   / \
  2   3
     / \
    4   5

非递归前序遍历的输出结果为:1 2 3 4 5。在Java中调用如下:

preorderNonRecursive(root);

示例2:假设给定一棵二叉树:

     1
   /   \
  2     3
 / \   / \
4   5 6   7

非递归前序遍历的输出结果为:1 2 4 5 3 6 7。在Java中调用如下:

preorderNonRecursive(root);

层序遍历

层序遍历也叫广度优先遍历,是二叉树另一种常用的遍历方法,它需要使用队列进行实现。

层序遍历的基本思路是:

  1. 将根节点放入队列中
  2. 当队列不为空时,循环执行以下操作:
    1. 弹出队首元素并遍历
    2. 将队首元素的左子树和右子树入队

Java实现如下:

public static void levelorder(TreeNode root) { // 层序遍历
    Queue<TreeNode> queue = new LinkedList<>();
    if (root != null) { // 如果不是空树,将根节点入队
        queue.offer(root);
    }
    while (!queue.isEmpty()) { // 队列不为空时循环
        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);
        }
    }
}

示例1:假设给定一棵二叉树:

    1
   / \
  2   3
     / \
    4   5

层序遍历的输出结果为:1 2 3 4 5。在Java中调用如下:

levelorder(root);

示例2:假设给定一棵二叉树:

     1
   /   \
  2     3
 / \   / \
4   5 6   7

层序遍历的输出结果为:1 2 3 4 5 6 7。在Java中调用如下:

levelorder(root);

到这里,Java实现的二叉树常用操作就讲解完了。希望对您有所帮助!

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java实现的二叉树常用操作【前序建树,前中后递归非递归遍历及层序遍历】 - Python技术站

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

相关文章

  • 文件无法直接发送到蓝牙点击右键没有发送到蓝牙设备

    文件无法直接发送到蓝牙点击右键没有发送到蓝牙设备 如果我们将电脑上的文件发送到其他设备使用蓝牙时,我们通常会采用右键菜单中的“发送到”操作。但是,有时候当我们右击待发送的文件时,却发现“发送到”选项中没有“蓝牙设备”选项,也无法直接将文件发送到蓝牙设备上。对于这种情况,我们可以尝试以下方法来解决: 方法一:重新启动蓝牙服务并连接设备 首先,我们需要确认蓝牙服…

    other 2023年6月27日
    00
  • 批处理版chm文件反编译器 v1.3

    批处理版chm文件反编译器 v1.3是一款用于反编译Windows的.chm帮助文件的工具,支持自动化批量处理。下面将结合示例介绍该工具的具体使用方法。 1. 下载与安装 批处理版chm文件反编译器 v1.3工具可以在Windows操作系统上运行,下载地址为:http://www.oyksoft.com/softdown/3.htm。下载后可直接解压运行,不…

    other 2023年6月26日
    00
  • QQ怎么设置自定义皮肤?

    下面是详细的攻略说明: QQ怎么设置自定义皮肤? 1. 下载皮肤素材 首先,你需要找到喜欢的QQ皮肤素材,可以在相关网站或者社交平台上搜寻并下载。通常,皮肤素材都会包含一个”*.zip”的压缩包,里面包含了相应的皮肤素材文件。在下载之前,你需要确保素材来源可信。 2. 解压缩皮肤文件 下载皮肤素材后,你需要解压缩文件。可以使用Windows系统自带的压缩软件…

    other 2023年6月25日
    00
  • smarty模板嵌套之include与fetch性能测试

    Smarty模板嵌套之include与fetch性能测试攻略 简介 Smarty是一个流行的PHP模板引擎,它提供了一种将业务逻辑与视图分离的方式。在Smarty中,模板嵌套是一种常见的技术,可以将多个模板组合在一起以实现复杂的页面结构。在本攻略中,我们将重点测试Smarty模板嵌套中的include和fetch两种方法的性能差异。 测试环境 在进行性能测试…

    other 2023年8月8日
    00
  • 批处理 实现定时关机、注销、重启、锁定等功能

    批处理是Windows操作系统自带的一种脚本语言,通过编写批处理脚本可以实现定时关机、注销、重启、锁定等功能。下面是实现这些功能的完整攻略: 实现定时关机 步骤一:新建txt文件,命名为shutdown.bat。 步骤二:在文件中输入以下代码: @echo off set /p time=请输入关机时间(单位:秒): shutdown -s -t %time…

    other 2023年6月27日
    00
  • C语言函数的基本使用和递归详解

    C语言函数的基本使用和递归详解 函数是C语言的核心特点之一,它可以将一些逻辑代码封装在函数内,形成独立的功能模块,便于调用和复用。本文将详细介绍函数的基本使用方法以及递归在函数中的应用。 函数的基本使用方法 在C语言中定义一个函数的基本结构如下: 返回类型 函数名(形参列表){ 函数体 return 返回值; } 返回类型:指定函数返回值的类型。如果函数不需…

    other 2023年6月27日
    00
  • 雷电模拟器完美伪装真机

    雷电模拟器完美伪装真机攻略 雷电模拟器是一款Android模拟器,可以在PC上运行Android应用程序。但是,有些应用程序会检测模拟器环境,导致无法正常运行。本攻略将介如何使用雷电拟器完美伪装真机,以便在模拟器上运行这些应用程序。 步骤 以下是使用电模拟器完美装真机的步骤: 下载并安装雷电模拟器。 打开雷电模拟器,入“设置”->“关模拟器”页面,查看…

    other 2023年5月7日
    00
  • linux下安装jre运行环境

    以下是关于“Linux下安装JRE运行环境”的完整攻略: 步骤1:下载JRE安装包 首先需要从Oracle官网下载JRE安装包。可以使用命令下载JRE安装包: wget -c –header "Cookie: oraclelicense=accept-securebackup-cookie" <JRE_download_url&g…

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