C#实现二叉查找树

C#实现二叉查找树

什么是二叉查找树

二叉查找树(Binary Search Tree)也称为二叉搜索树,简称BST。它是一种基于二分查找思想的非线性数据结构,由多个节点组成,每个节点包含一个键值,同时有两个指针分别指向左右子节点,满足以下性质:

  1. 左子树上所有节点的键值小于它的根节点的键值。
  2. 右子树上所有节点的键值大于它的根节点的键值。
  3. 左右子树也必须是二叉查找树。

因此,二叉查找树在查找、插入、删除等操作上具有高效性。

C#实现二叉查找树

定义节点

首先,我们需要定义二叉查找树的节点类,其中包括三个字段:节点的键值、左子节点、右子节点。

class BSTNode<T>
{
    public T Key { get; set; }
    public BSTNode<T> Left { get; set; }
    public BSTNode<T> Right { get; set; }
}

插入节点

插入节点分两种情况:树为空或树不为空。当树为空时,只需要新建一个节点,并将该节点作为二叉查找树的根节点;当树不为空时,需要在树中找到插入位置。具体操作如下:

  1. 从根节点开始查找(初始化为根节点)。
  2. 如果插入节点的键值小于当前节点的键值,则继续在当前节点的左子树上查找,否则在右子树上查找。
  3. 重复上述操作,直到找到插入位置(左子树或右子树为空)。
  4. 将新节点插入到该位置。
class BST<T> where T : IComparable<T>
{
    private BSTNode<T> root;

    public void Insert(T key)
    {
        BSTNode<T> node = new BSTNode<T> { Key = key };

        if (root == null)
        {
            root = node;
            return;
        }

        BSTNode<T> current = root;
        while (true)
        {
            if (node.Key.CompareTo(current.Key) < 0)
            {
                if (current.Left == null)
                {
                    current.Left = node;
                    return;
                }

                current = current.Left;
            }
            else
            {
                if (current.Right == null)
                {
                    current.Right = node;
                    return;
                }

                current = current.Right;
            }
        }
    }
}

查找节点

查找节点同样分两种情况:树为空或树不为空。当树为空时,节点不存在;当树不为空时,需要在树中查找。具体操作如下:

  1. 从根节点开始查找(初始化为根节点)。
  2. 如果查找键值小于当前节点的键值,则继续在当前节点的左子树上查找,否则在右子树上查找。
  3. 重复上述操作,直到找到对应节点或到达叶节点。
class BST<T> where T : IComparable<T>
{
    // ...

    public bool Search(T key)
    {
        BSTNode<T> current = root;
        while (current != null)
        {
            if (key.CompareTo(current.Key) == 0)
            {
                return true;
            }
            else if (key.CompareTo(current.Key) < 0)
            {
                current = current.Left;
            }
            else
            {
                current = current.Right;
            }
        }

        return false;
    }
}

示例说明

下面给出两个插入操作的示例:

BST<int> bst = new BST<int>();
bst.Insert(5);
bst.Insert(3);
bst.Insert(7);
bst.Insert(1);
bst.Insert(9);

插入后的二叉查找树如下:

          5
       /     \
      3       7
     /       / \
    1       9   null
   / \
null null

下面给出一个查找操作的示例:

bool exist = bst.Search(3);
if (exist)
{
    Console.WriteLine("Node 3 exists.");
}
else
{
    Console.WriteLine("Node 3 does not exist.");
}

输出结果是Node 3 exists.

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#实现二叉查找树 - Python技术站

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

相关文章

  • C# TextWriter.Close – 关闭文本编写器

    C#中的TextWriter类是一个抽象类,用于向文本或流中写入字符。 Close() 方法是 TextWriter 类的一个实例方法,用于关闭当前 writer 对象并释放与此对象关联的所有系统资源(比如内存和句柄)。 以下是 TextWriter.Close 方法的使用方法: public virtual void Close (); 在调用 Close…

    C# 2023年4月19日
    00
  • C# Path.GetPathRoot(string path):获取指定路径的根目录

    Path.GetPathRoot(string path)方法是C#提供的一个静态方法,用于获取指定路径的根目录。下面是对该方法的完整攻略: 方法作用 方法名:Path.GetPathRoot(string path) 作用:获取指定路径的根目录。 使用方法 语法:Path.GetPathRoot(string path) 参数:path- 要获取根目录的路…

    C# 2023年4月19日
    00
  • abp(net core)+easyui+efcore实现仓储管理系统——模块管理升级(六十)

    Abp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统——ABP总体介绍(一) abp(net core)+easyui+efcore实现仓储管理系统——解决方案介绍(二) abp(net core)+easyui+efcore实现仓储管理系统——领域层创建实体(三)…

    C# 2023年4月18日
    00
  • 如何使用Dapper处理多个结果集与多重映射实例教程

    下面是详细的攻略: 什么是Dapper? Dapper是一个开源的、轻量级的ORM(对象关系映射)框架,它是StackExchange出品的,具有高性能、易用等特点。它适用于多种数据库,并且可以从NuGet中轻松获取到。 处理多个结果集 在Dapper中处理多个结果集的方法很简单,只需在Query方法中传入一个参数splitOn即可。 假设我们的数据库中有两…

    C# 2023年6月6日
    00
  • C#使用SQL DataAdapter数据适配代码实例

    SQL DataAdapter 是什么? SQL DataAdapter 是 ADO.NET 的一部分,他允许 C# 将数据从 SQL 数据库服务器检索到以 DataSet 和 DataTable 对象表示的本地内存中。使用 DataAdapter 对象,可以轻松地自动化与数据源的通信和数据填充。 C# 使用 DataAdapter 填充 DataSet 的…

    C# 2023年6月2日
    00
  • C# 抓图服务的实现

    下面是详细的讲解。 C# 抓图服务的实现 用 C# 实现一个抓图服务是一个非常实用的功能。在一些需要截屏或者截图的场景中,它可以自动化这个过程,非常方便。这里将介绍用 C# 实现一个简单的抓图服务的过程,并提供两个示例说明。 准备工作 在 C# 中通过 System.Windows.Forms 命名空间中的 Screen 类可以实现抓屏功能。在实现抓图服务之…

    C# 2023年6月6日
    00
  • websocket与C# socket相互通信

    web端代码就是js代码,C#有两种方式:使用第三方库,如Fleck,使用C#原生socket编程实现   web端: <!doctype html> <html lang=”zh-CN”> <head> <meta charset=”UTF-8″> <title>下发网站上文件到学生机</t…

    C# 2023年4月24日
    00
  • C#使用foreach语句简单遍历数组的方法

    C#的foreach语句是一种简单遍历数组的方法,可以快速方便地遍历数组中的元素。下面我们来详细讲解如何使用foreach语句进行数组遍历: 1.基本语法 foreach语句的基本语法如下: foreach (var item in array) { // 遍历的操作 } 其中var item是用来表示遍历到的数组元素的变量名,array则是需要遍历的数组名…

    C# 2023年6月7日
    00
合作推广
合作推广
分享本页
返回顶部