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日

相关文章

  • 基于Java8实现提高Excel读写效率

    基于Java8实现提高Excel读写效率 1. 导入依赖 我们可以使用Apache POI库来读写Excel,那么我们先来看一下如何在Java中导入Apache POI库的依赖。 <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi<…

    Java 2023年5月26日
    00
  • JSP页面中文参数的传递(get和post方法分析)

    关于JSP页面中文参数的传递,我们需要了解以下几点: JSP页面中传递参数的方式一般有两种:get方法和post方法。 为了避免中文乱码问题,我们在处理传递的参数时需要对字符编码进行设置。 对于get方法传递的参数,可以使用URLEncoder对中文进行编码,而在JSP页面接收时可以使用URLDecoder进行解码,即可得到原始中文字符串。 对于post方法…

    Java 2023年6月15日
    00
  • JSP中实现判断客户端手机类型并跳转到app下载页面

    JSP是JavaServer Pages(Java服务器页面)的缩写,它是一种动态网页技术,允许我们在网页中插入Java代码,从而实现动态内容展示和逻辑控制。要实现判断客户端手机类型并跳转到app下载页面,我们需要从以下几个方面入手: 判断客户端的手机类型 根据不同的手机类型进行分流 跳转到app下载页面 下面具体讲解实现的步骤: 1. 判断客户端的手机类型…

    Java 2023年6月15日
    00
  • Java编程将汉字转Unicode码代码示例

    现在我为您提供详细讲解“Java编程将汉字转Unicode码代码示例”的完整攻略。 1. 什么是Unicode码 Unicode是计算机科学中的一种编码方案,用于统一表示世界上各个文字的字符集。由于不同的国家与地区使用的文字不同,因此需要采用不同的编码方式来表示,Unicode便应运而生。 Unicode中的每个字符都有一个唯一的编号,这个编号通常被表示为一…

    Java 2023年5月20日
    00
  • Java的Swing编程中使用SwingWorker线程模式及顶层容器

    Java的Swing编程中,使用SwingWorker线程模式以及顶层容器可以实现多线程的UI操作,避免了长时间运行的任务卡住了界面的情况。下面将详细介绍如何使用SwingWorker线程模式及顶层容器进行Swing编程。 一、SwingWorker线程模式 SwingWorker是Java提供的一个工具类,用于在后台线程中执行耗时的任务,并在任务完成后通知…

    Java 2023年5月26日
    00
  • 使用IDEA配置Tomcat和连接MySQL数据库(JDBC)详细步骤

    以下是使用IDEA配置Tomcat和连接MySQL数据库(JDBC)详细步骤: 配置Tomcat 步骤1:下载Tomcat 首先,我们需要下载Tomcat。可以在Tomcat官网下载。下载完成后,将Tomcat压缩包解压到本地合适的目录。 步骤2:在IDEA中添加Tomcat服务器 1.打开IDEA,进入File -> Settings -> B…

    Java 2023年5月20日
    00
  • java读取文件内容,解析Json格式数据方式

    Java 读取文件内容并解析 Json 格式数据的方式可以通过 Gson 这个 Google 提供的开源库来实现。 以下是实现步骤: 步骤1:导入Gson库 在 pom.xml 中添加以下依赖: <dependencies> <dependency> <groupId>com.google.code.gson</gr…

    Java 2023年5月20日
    00
  • Java简化复杂系统调用的门面设计模式

    Java简化复杂系统调用的门面设计模式,也叫做Facade模式,是一种结构型设计模式,目的是为系统中的高层模块提供简化、统一的接口,使系统更易于使用和维护。 下面是实现Java门面设计模式的完整攻略: 1. 定义门面类 首先,我们需要定义一个门面类来隐藏系统中的复杂性。这个类需要提供一个简单的接口,封装系统中的一些复杂操作。 public class Sys…

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