Java数据结构之二叉搜索树详解

yizhihongxing

我为您详细讲解“Java数据结构之二叉搜索树详解”的完整攻略。

什么是二叉搜索树?

二叉搜索树(Binary Search Tree,简称BST)是一种特殊的二叉树,它的每个节点最多有两颗子树,左子树元素均小于当前节点元素,右子树元素均大于当前节点元素,左右子树都是二叉搜索树。

二叉搜索树的优点在于能够提供进行二分查找的能力,对于动态集合的数据操作,二叉搜索树是一种效率很高、时间复杂度很低的数据结构。

二叉搜索树的基本操作

二叉搜索树有四个基本操作:插入元素、删除元素、查找元素、遍历元素。下面我们一一介绍。

插入元素

  1. 如果当前树为空,则将新节点插入。

  2. 如果新节点的值小于当前节点的值,则从左子树继续进行插入操作。

  3. 如果新节点的值大于当前节点的值,则从右子树继续进行插入操作。

示例代码:

public void insert(int value) {
    if (root == null) {
        root = new TreeNode(value);
        return;
    }

    insert(root, value);
}

private void insert(TreeNode node, int value) {
    if (node.value > value) {
        if (node.left == null) {
            node.left = new TreeNode(value);
        } else {
            insert(node.left, value);
        }
    } else {
        if (node.right == null) {
            node.right = new TreeNode(value);
        } else {
            insert(node.right, value);
        }
    }
}

删除元素

  1. 如果要删除的元素不存在,则退出删除。

  2. 如果要删除的元素小于当前节点的值,则从左子树继续进行删除操作。

  3. 如果要删除的元素大于当前节点的值,则从右子树继续进行删除操作。

  4. 如果要删除的元素等于当前节点的值,则判断当前节点的类型,分情况讨论:

    1. 如果当前节点只有一个子节点,则将子节点替换当前节点的位置。

    2. 如果当前节点有两个子节点,则从右子树中找到最小的节点,并将其值替换当前节点的值,再从右子树中删除这个最小节点。

示例代码:

public void remove(int value) {
    remove(null, root, value);
}

private void remove(TreeNode parent, TreeNode node, int value) {
    if (node == null) {
        return;
    }

    if (value < node.value) {
        remove(node, node.left, value);
    } else if (value > node.value) {
        remove(node, node.right, value);
    } else if (node.left != null && node.right != null) {
        node.value = getMinValue(node.right);
        remove(node, node.right, node.value);
    } else if (parent == null) {
        if (node.left != null) {
            root = node.left;
        } else if (node.right != null) {
            root = node.right;
        } else {
            root = null;
        }
    } else if (parent.left == node) {
        parent.left = node.left != null ? node.left : node.right;
    } else if (parent.right == node) {
        parent.right = node.left != null ? node.left : node.right;
    }
}

private int getMinValue(TreeNode node) {
    while (node.left != null) {
        node = node.left;
    }
    return node.value;
}

查找元素

  1. 如果当前树为空,则退出查找。

  2. 如果要查找的元素等于当前节点的值,则返回当前节点。

  3. 如果要查找的元素小于当前节点的值,则从左子树继续进行查找操作。

  4. 如果要查找的元素大于当前节点的值,则从右子树继续进行查找操作。

示例代码:

public TreeNode search(int value) {
    return search(root, value);
}

private TreeNode search(TreeNode node, int value) {
    if (node == null || node.value == value) {
        return node;
    }

    if (node.value > value) {
        return search(node.left, value);
    } else {
        return search(node.right, value);
    }
}

遍历元素

二叉搜索树有三种遍历方式:中序遍历、前序遍历和后序遍历。

中序遍历的实现方式是递归遍历当前节点的左子树,输出当前节点的值,再递归遍历当前节点的右子树。

前序遍历的实现方式是输出当前节点的值,递归遍历当前节点的左子树,递归遍历当前节点的右子树。

后序遍历的实现方式是递归遍历当前节点的左子树,递归遍历当前节点的右子树,输出当前节点的值。

示例代码:

public void inorderTraversal(TreeNode node) {
    if (node == null) {
        return;
    }

    inorderTraversal(node.left);
    System.out.print(node.value + " ");
    inorderTraversal(node.right);
}

public void preorderTraversal(TreeNode node) {
    if (node == null) {
        return;
    }

    System.out.print(node.value + " ");
    preorderTraversal(node.left);
    preorderTraversal(node.right);
}

public void postorderTraversal(TreeNode node) {
    if (node == null) {
        return;
    }

    postorderTraversal(node.left);
    postorderTraversal(node.right);
    System.out.print(node.value + " ");
}

示例说明

下面给出两个二叉搜索树的操作示例:

示例一

先创建一棵空的二叉搜索树:

BinarySearchTree bst = new BinarySearchTree();

插入元素1:

bst.insert(1);

插入元素3:

bst.insert(3);

插入元素2:

bst.insert(2);

遍历输出:

bst.inorderTraversal(bst.root); // 输出1 2 3

删除元素1:

bst.remove(1);

遍历输出:

bst.inorderTraversal(bst.root); // 输出2 3

示例二

创建包含多个元素的二叉搜索树:

BinarySearchTree bst = new BinarySearchTree();
bst.insert(5);
bst.insert(3);
bst.insert(7);
bst.insert(1);
bst.insert(9);

查找元素7:

bst.search(7); // 返回节点值为7的节点

删除元素5:

bst.remove(5);

遍历输出:

bst.inorderTraversal(bst.root); // 输出1 3 7 9

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java数据结构之二叉搜索树详解 - Python技术站

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

相关文章

  • WPF学习09:数据绑定之 Binding to List Data

    WPF学习09:数据绑定之 Binding to List Data 在WPF中,数据绑定是一项非常重要的功能,它可以让我们将UI元素与数据源进行绑定,使得数据的变化能够自动地反映到UI上。本文介绍如何绑定列表数据到WPF的UI元素中。 Binding to List Data 在WPF中,Binding to List Data是一种常见的数据绑定方式,它…

    其他 2023年3月28日
    00
  • Django 设置多环境配置文件载入问题

    Django 是一个开源的 Python Web 框架,它提供了灵活的配置和管理方式。在开发环境和生产环境中,我们通常需要有不同的配置文件来设置数据库连接、调试模式和静态文件等。本文将详细讲解如何在 Django 中设置多环境配置文件载入问题。 1. 准备工作 首先,我们需要在 Django 项目根目录下创建一个名为 settings 的文件夹,并在该文件夹…

    other 2023年6月27日
    00
  • 浅析Vue 生命周期

    浅析Vue生命周期 Vue生命周期可以分为8个阶段,分别是: 创建阶段:beforeCreate、created、beforeMount; 挂载阶段:mounted; 更新阶段:beforeUpdate、updated; 销毁阶段:beforeDestroy、destroyed。 这些钩子函数可以让你在特定的时刻执行到某些自定义的逻辑,比如数据的初始化、渲染…

    other 2023年6月27日
    00
  • mybatis plus实现条件查询

    MyBatis Plus 实现条件查询攻略 MyBatis Plus 是一个基于 MyBatis 的增强工具,提供了更简单、更便捷的方式来操作数据库。在 MyBatis Plus 中,条件查询是一种常见的操作,可以根据指定的条件从数据库中检索数据。下面是实现条件查询的完整攻略,包含两个示例说明。 步骤一:导入依赖 首先,需要在项目的 pom.xml 文件中添…

    other 2023年7月28日
    00
  • 办公室电脑数据防泄密、企业重要文档防复制、商业机密防泄漏解决方案

    办公室电脑数据防泄密解决方案 1. 硬件加密 如果办公室电脑中存储了重要的数据,我们建议用硬件加密来保护数据安全。常见的硬件加密方案有: 加密外置硬盘:可以选择带有硬件加解密功能的移动硬盘,例如西部数据的WD My Passport硬盘。该硬盘具有密码保护、硬件加密等功能,确保数据安全。 加密USB存储设备:有些USB存储设备可以使用密码来保护数据,例如金士…

    other 2023年6月27日
    00
  • python人民币小写转大写辅助工具

    Python人民币小写转大写辅助工具攻略 本攻略将详细介绍如何使用Python编写一个辅助工具,用于将人民币金额的小写数字转换为大写中文金额。以下是完整的攻略步骤: 步骤一:导入必要的模块 首先,我们需要导入re模块,用于正则表达式匹配,以及num2chinese模块,用于将数字转换为中文金额。 import re from num2chinese impo…

    other 2023年8月18日
    00
  • require与import

    require与import 在JavaScript中,require和import是两种不同的方法,都用于在一个文件中引入其他模块或库。本文将介绍它们的使用方法、差异以及应该如何选择使用哪一个。 require require是一个Node.js的方法,也可以在一些类似WebPack之类的开发工具中使用。通常,我们使用require来引入CommonJS模…

    其他 2023年3月28日
    00
  • servlet配置方法及其生命周期详解

    下面我来为您详细讲解“servlet配置方法及其生命周期详解”的完整攻略。 一、servlet配置方法 在web.xml中的标签和标签中配置。以下是一个示例: 配置 <servlet> <servlet-name>MyServlet</servlet-name> <servlet-class>com.examp…

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