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日

相关文章

  • 用Newtonsoft将json串转为对象的方法(详解)

    当我们需要将 JSON 格式的字符串转换为 C# 对象时,通常会使用 Newtonsoft.Json 库。下面是将 JSON 字符串转换为 C# 对象的详细步骤: 步骤 1:安装 Newtonsoft.Json 库 首先,需要在项目中安装 Newtonsoft.Json 库。可以通过 NuGet 包管理器搜索并安装“Newtonsoft.Json”。 步骤 …

    C# 2023年5月31日
    00
  • C#面向对象设计原则之里氏替换原则

    C#面向对象设计原则之里氏替换原则 什么是里氏替换原则 里氏替换原则(Liskov Substitution Principle,LSP)是面向对象设计中的一个基本原则。它重新定义了关于继承的条款。原始的定义是由“Barbara Liskov”于1987年提出的:“如果对于每一个类型为 T1 的对象 o1 都有类型为 T2 的对象 o2,使得以 T1 定义的…

    C# 2023年5月14日
    00
  • 一个支持普通分页和综合分页的MVC分页Helper

    针对这个话题,我将提供一个完整的攻略来实现一个支持普通分页和综合分页的MVC分页Helper。 目录 前言 步骤1:创建分页Helper 步骤2:使用分页Helper 示例1:普通分页 示例2:综合分页 前言 MVC中的分页是非常常见的需求,通过分页我们可以实现对数据的有序浏览和管理。普通分页的实现其实并不是太难,但是如何实现综合分页则有些复杂。在这里,我将…

    C# 2023年5月31日
    00
  • C#中常用的IO操作介绍

    C#中常用的IO操作介绍 C#中提供了一套强大的IO库,方便进行文件读写和其他IO操作。本篇文章将为您简要介绍几种C#中常用的IO操作。 文件读写 读取文件 使用System.IO.File类可以读取文件。下面是一个简单的示例,它从文件中读取一些文本然后将其输出到控制台。 using System; using System.IO; class Progra…

    C# 2023年6月1日
    00
  • asp.net获取服务器基本信息的方法代码

    当在开发ASP.NET应用程序时,我们经常需要获取服务器的基本信息,例如操作系统版本、处理器等。下面我将详细讲解如何通过代码获取这些信息。 获取操作系统版本以及平台信息 我们可以通过System.Environment类中的OSVersion和ProcessorCount属性来获取服务器的操作系统版本信息和处理器的数量。具体代码如下: using Syste…

    C# 2023年5月31日
    00
  • C# WPF调用QT窗口的方法

    C# WPF调用QT窗口的方法 在开发中,有时我们需要使用C# WPF调用QT窗口,可以通过以下方法实现。 1. 安装QT开发工具并创建QT窗口 首先需要下载并安装QT开发工具,然后创建一个QT窗口,在窗口中添加需要的控件和逻辑代码,最后编译并生成QT窗口的可执行文件(exe文件)。 确保QT窗口的可执行文件能够正常运行,无误后进行下一步操作。 2. 编写C…

    C# 2023年6月7日
    00
  • C# 获取汉字的拼音首字母

    下面是关于如何在C#中获取汉字的拼音首字母的攻略: 安装NuGet包 在使用C#编写代码之前,需要先安装相应的NuGet包。在Visual Studio的NuGet包管理器中搜索“NPinyin”并安装。 导入命名空间 完成NuGet包的安装后,需要在代码文件的顶部导入“NPinyin”命名空间,如下所示: using NPinyin; 调用API获取拼音 …

    C# 2023年6月7日
    00
  • C#笔记之EF Code First 数据模型 数据迁移

    C#笔记之EF Code First 数据模型 数据迁移 在使用.NET Core进行开发时,EF Code First被广泛用作ORM框架,在应用程序开发的不同阶段,会涉及到数据模型的改变,而EF Code First提供了一些工具来管理数据迁移,下面将介绍如何进行EF Code First数据模型的创建、数据迁移的方法和注意点。 创建数据模型 新建项目 …

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