Java实现二叉树的基本操作详解

Java实现二叉树的基本操作详解

二叉树是一种非常常见的树形结构,由于它的具有良好的数据存储和查询性能,在实际开发中也经常使用到。本文将介绍如何使用Java语言实现二叉树的基本操作,包括构建二叉树、插入节点、删除节点、查找节点等功能。

二叉树节点的定义

首先,我们需要定义一个二叉树节点类,它包含三个属性,分别是节点值、左子节点和右子节点,定义如下:

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

构建二叉树

我们可以通过先序遍历的方式来构建二叉树。具体实现如下:

public TreeNode buildTree(int[] preorder, int[] inorder) {
    return buildTree(preorder, 0, preorder.length - 1, inorder, 0, inorder.length - 1);
}

private TreeNode buildTree(int[] preorder, int preStart, int preEnd, int[] inorder, int inStart, int inEnd) {
    if (preStart > preEnd || inStart > inEnd) {
        return null;
    }

    int rootVal = preorder[preStart];
    int rootIndex = 0;
    for (int i = inStart; i <= inEnd; i++) {
        if (inorder[i] == rootVal) {
            rootIndex = i;
            break;
        }
    }

    int leftSize = rootIndex - inStart;
    TreeNode root = new TreeNode(rootVal);
    root.left = buildTree(preorder, preStart + 1, preStart + leftSize, inorder, inStart, rootIndex - 1);
    root.right = buildTree(preorder, preStart + leftSize + 1, preEnd, inorder, rootIndex + 1, inEnd);
    return root;
}

例如,我们有如下先序遍历和中序遍历序列:

先序遍历序列:[3,9,20,15,7]

中序遍历序列:[9,3,15,20,7]

我们可以通过下面的代码来构建二叉树:

int[] preorder = new int[] {3,9,20,15,7};
int[] inorder = new int[] {9,3,15,20,7};
TreeNode root = buildTree(preorder, inorder);

插入节点

如果我们需要在已有二叉树中插入一个节点,可以按照以下步骤进行:

  • 从根节点开始搜索,直到找到一个叶子节点空位,将新节点插入到这个位置上。

具体实现如下:

public void insertIntoBST(TreeNode root, int val) {
    if (root == null) {
        return new TreeNode(val);
    }

    if (val < root.val) {
        root.left = insertIntoBST(root.left, val);
    } else {
        root.right = insertIntoBST(root.right, val);
    }

    return root;
}

例如,我们有如下二叉树:

      4
    /  \
   2    7
  / \
 1   3

我们可以按照以下方式插入一个节点值为 5 的节点:

TreeNode root = insertIntoBST(root, 5);

插入后,二叉树变为:

      4
    /  \
   2    7
  / \   
 1   3    
      \
       5

删除节点

如果我们需要删除已有二叉树中的一个节点,可以按照以下步骤进行:

  • 如果要删除的节点是叶子节点,直接删除即可。
  • 如果要删除的节点只有一个子节点,直接删除该节点,并将其子节点替换成其父节点的子节点。
  • 如果要删除的节点有两个子节点,需要找到其右子树的最小节点,将其值替换到当前节点,然后递归的删除右子树的最小节点。

具体实现如下:

public TreeNode deleteNode(TreeNode root, int key) {
    if (root == null) {
        return null;
    }

    if (key < root.val) {
        root.left = deleteNode(root.left, key);
    } else if (key > root.val) {
        root.right = deleteNode(root.right, key);
    } else {
        if (root.left == null && root.right == null) {
            return null;
        } else if (root.left == null) {
            return root.right;
        } else if (root.right == null) {
            return root.left;
        } else {
            TreeNode minNode = findMin(root.right);
            root.val = minNode.val;
            root.right = deleteNode(root.right, minNode.val);
        }
    }

    return root;
}

private TreeNode findMin(TreeNode node) {
    while (node.left != null) {
        node = node.left;
    }
    return node;
}

例如,我们有如下二叉树:

      4
    /  \
   2    7
  / \
 1   3

我们可以按照以下方式删除节点值为 2 的节点:

TreeNode root = deleteNode(root, 2);

删除后,二叉树变为:

      4
    /  \
   1    7
    \   
     3

查找节点

如果我们需要在已有二叉树中查找一个节点,可以按照以下步骤进行:

  • 从根节点开始查找。
  • 如果节点值等于要查找的节点值,返回该节点。
  • 如果要查找的节点值小于当前节点值,则递归的在左子树中查找。
  • 如果要查找的节点值大于当前节点值,则递归的在右子树中查找。

具体实现如下:

public TreeNode searchBST(TreeNode root, int val) {
    if (root == null) {
        return null;
    }

    if (root.val == val) {
        return root;
    } else if (val < root.val) {
        return searchBST(root.left, val);
    } else {
        return searchBST(root.right, val);
    }
}

例如,我们有如下二叉树:

      4
    /  \
   2    7
  / \
 1   3

我们可以按照以下方式查找节点值为 3 的节点:

TreeNode node = searchBST(root, 3);

查找到的节点为:

3

/ \
1 3

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java实现二叉树的基本操作详解 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • 详解JavaScript中的函数、对象

    详解JavaScript中的函数 JavaScript中的函数是非常重要的一个概念,它不仅仅可以完成一些基本的计算和逻辑操作,还可以使用函数作为参数、返回值或者构造函数。以下是详细讲解函数的内容。 函数声明 在JavaScript中,函数的声明可以使用function关键字,其后跟随函数名、参数列表和函数体。 function add(a, b) { ret…

    Java 2023年5月26日
    00
  • Java aop面向切面编程(aspectJweaver)案例详解

    Java AOP面向切面编程(AspectJ Weaver)案例详解 什么是AOP? AOP全称Aspect-Oriented Programming,即面向切面编程。它是一种基于OOP(Object-Oriented Programming,面向对象编程)的编程思想,用于解决模块化开发中横切关注点的问题,以通过对横切关注点进行抽象,实现系统各模块之间的解耦…

    Java 2023年5月19日
    00
  • JDBC连接MySQL并实现模糊查询

    下面是实现JDBC连接MySQL并实现模糊查询的完整攻略以及两条示例。 步骤一:导入MySQL JDBC驱动包 在使用Java连接MySQL之前,我们需要先将MySQL JDBC驱动包导入到项目中。 推荐使用官方提供的驱动包,下载地址:https://dev.mysql.com/downloads/connector/j/ 下载完成后,将驱动包添加到项目的c…

    Java 2023年5月20日
    00
  • springboot整合持久层的方法实现

    Spring Boot是一个非常流行的Java Web框架,它提供了很多方便的功能来简化应用程序的开发。其中,整合持久层是Spring Boot应用程序中的一个重要部分。以下是Spring Boot整合持久层的方法实现的详细攻略: 选择持久层框架 在Spring Boot中,我们可以选择使用多种持久层框架,如Hibernate、MyBatis、Spring …

    Java 2023年5月15日
    00
  • 云服务器部署 Web 项目的实现步骤

    云服务器部署 Web 项目的实现步骤可分为以下几个步骤: 购买云服务器首先需要选择一个云服务器提供商,比如阿里云、腾讯云等,根据需求选择一款适合自己的云服务器型号和配置,并进行购买。 配置服务器环境在服务器上安装部署相关的环境和软件,如 Nginx、MySQL、PHP 等,以保证 Web 项目可以正常运行。可以通过 SSH 工具连接到服务器进行安装和配置。 …

    Java 2023年6月2日
    00
  • java system类使用方法示例 获取系统信息

    当我们需要获取系统基本信息时,可以使用Java中的System类。它提供了许多有用的静态方法,方便我们获取系统信息。这里就让我们来详细讲解“java system类使用方法示例 获取系统信息”的完整攻略。 1. 获取系统属性信息 使用System.getProperty()方法可以获取系统的属性信息,如下所示: public class Example { …

    Java 2023年6月15日
    00
  • SpringBoot配置和切换Tomcat流程详解

    关于SpringBoot配置和切换Tomcat的流程,我来为您详细讲解。 1. SpringBoot 配置 Tomcat 的默认端口 SpringBoot默认使用的Tomcat端口是8080,可以通过在配置文件中配置server.port来修改端口号,例如设置为8090端口,只需要按照以下步骤操作: 打开配置文件application.properties或…

    Java 2023年6月2日
    00
  • Android NDK 开发教程

    Android NDK 开发教程 什么是 Android NDK Android NDK 全称 Native Development Kit,是 Android 官方提供的一个工具集,可用于加速使用 C/C++ 语言编写的应用程序的开发和性能优化。 使用 NDK 进行开发的主要优势在于: 提高了应用程序的性能:使用原生 C/C++ 代码编写可以实现更快的执行…

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