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日

相关文章

  • struts1之ActionServlet详解_动力节点Java学院整理

    这里给出的是针对文章 “struts1之ActionServlet详解_动力节点Java学院整理” 的完整攻略。 标题 struts1之ActionServlet详解_动力节点Java学院整理 简介 本文主要介绍Struts1框架中的ActionServlet的作用和详解。 正文 介绍 ActionServlet是Struts框架的核心控制器,它负责解析请求…

    Java 2023年5月20日
    00
  • bootstrap table使用入门基本用法

    接下来我将详细讲解“bootstrap table使用入门基本用法”的完整攻略。 什么是Bootstrap Table? Bootstrap Table是基于Bootstrap框架开发的一个表格插件,可以方便地创建美观、高度可定制的数据表格。它支持排序、分页、搜索、过滤等常见表格功能,同时也支持自定义样式、事件、单元格渲染等高级功能。 如何使用Bootstr…

    Java 2023年6月15日
    00
  • 计算机二级考试java软件操作教程 教大家如何学习java

    计算机二级考试Java软件操作教程 为什么学习Java? Java是一门跨平台的编程语言,在开发Web应用、移动应用、桌面应用等众多领域都有广泛应用。学习Java可以让程序员扩展自己的技能树,更好地适应市场需求。而计算机二级考试中也有Java相关的考察内容,学习Java可以更好地准备考试。 学习Java的基本步骤 下载安装Java开发环境(JDK)和集成开发…

    Java 2023年5月20日
    00
  • java.lang.Void 与 void的比较及使用方法介绍

    Java中的Void和void Java中的Void和void是两个容易混淆的概念,但实际上它们是有着明显的区别的。 Void 先来看看Void。Void是Java中的一个类,不同于基本类型(如int和double),它不能进行实例化。Void类只有一个实例,即常量Void.TYPE,表示的是空类型。 我们可以用Void类来定义一个返回值类型为void的方法…

    Java 2023年5月26日
    00
  • java多态实现电子宠物系统

    实现电子宠物系统可以使用Java多态的特性,以下是完整攻略: 一、电子宠物系统的基本要求 电子宠物系统是模拟一个宠物的生命周期,包括喂食、玩耍、睡觉、生病等多种状态。系统需要实现以下功能: 宠物属性:宠物的名字、体力、饥饿值等属性; 宠物动作:宠物可以吃食物、玩耍、睡觉、生病、死亡等; 宠物状态:宠物会根据不同的状态进行不同的动作,例如当它饥饿时就会吃食物。…

    Java 2023年5月24日
    00
  • JAVA+Struts2获取服务器地址的方法

    要获取服务器地址,有几种情况可以考虑: 获取请求的完整URL Struts2可以通过HttpServletRequest的getRequestURL方法获取当前请求URL,包括协议,主机名,端口和路径。在Action类中可以这样获取: import javax.servlet.http.HttpServletRequest; import com.opens…

    Java 2023年5月20日
    00
  • 为什么在foreach循环中JAVA集合不能添加或删除元素

    为什么在foreach循环中JAVA集合不能添加或删除元素 在foreach循环中,JAVA集合是不允许添加或删除元素的。这是由于foreach循环需要遍历整个集合,而在循环过程中添加或删除元素会打乱集合中元素的顺序,从而可能导致遍历出错或漏掉某些元素,因此被JAVA设计者禁止了。 示例一: List<Integer> list = new Ar…

    Java 2023年5月20日
    00
  • 通过url方式传递中文乱码的解决方法

    当我们在URL中传递中文时,由于URL只能传输ASCII码,因此中文需要经过特定的编码方式转化为符合URL传输的ASCII码(比如UTF-8编码),而这个过程容易造成中文乱码的问题。下面介绍两种解决乱码的方式: 一、使用url编码 URL编码是一种将某些字符转换为%XX(XX为16进制)格式的编码方式,在不同语言的处理方式中可能有所不同。在JavaScrip…

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