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日

相关文章

  • Mvc提交表单的四种方法全程详解

    Mvc提交表单的四种方法全程详解 本文将详细讲解 MVC 中提交表单的四种方法,并提供示例说明。四种方法分别为 GET、POST、PUT 和 DELETE。 在开始之前,我们需要了解一下 MVC 的控制器(Controller)和视图(View)。控制器负责接受用户的请求并处理请求,视图负责展示数据。 1. GET 方法 GET 方法通常用于获取数据,比如查…

    C# 2023年5月31日
    00
  • c#实现识别图片上的验证码数字

    C#是一种广泛使用的编程语言,可以用于开发各种类型的应用程序。本文将介绍如何使用C#实现识别图片上的验证码数字的完整攻略。 步骤一:获取验证码图片 首先,需要获取验证码图片。可以使用WebClient类从网站上下载验证码图片,也可以使用HttpWebRequest类从网站上获取验证码图片。以下是一个使用WebClient类下载验证码图片的示例: using …

    C# 2023年5月15日
    00
  • C#面向对象实现图书管理系统

    C#面向对象实现图书管理系统 系统简介 图书管理系统是一个用于管理图书馆和书店的软件系统。该系统可以实现对图书的入库、出库、借阅、归还等操作,同时还可以对图书进行查询、统计、打印等功能的实现。本文介绍使用C#面向对象的编程思想实现图书管理系统的完整攻略。 系统设计 系统结构设计 我们可以将图书管理系统分为以下几个模块: 用户管理模块:用于管理系统用户的登录、…

    C# 2023年5月31日
    00
  • 基于WPF实现简单的文件夹比较工具

    下面是基于WPF实现简单的文件夹比较工具的完整攻略: 1. 确定需求和设计 首先,我们需要确定工具的功能需求,比如需要比较哪些文件夹,比较的方式是什么,如何显示比较结果等等。针对这些需求,我们可以设计出大致的界面和数据结构,以方便后续的实现。 2. 实现比较逻辑 其次,我们需要编写代码实现比较功能。可以使用C#自带的Directory类来获取文件夹中的文件和…

    C# 2023年6月1日
    00
  • 如何给asp.net core写个中间件记录接口耗时

    在ASP.NET Core中,中间件是一种用于处理HTTP请求和响应的组件。我们可以使用中间件来记录接口的耗时,以便我们可以更好地了解我们的应用程序的性能。在本攻略中,我们将介绍如何编写一个中间件来记录接口的耗时,并提供两个示例说明。 实现步骤 以下是在ASP.NET Core中编写一个中间件来记录接口耗时的步骤: 创建一个新的ASP.NET Core We…

    C# 2023年5月16日
    00
  • .NET Core支持Cookie和JWT混合认证、授权的方法

    在.NET Core中,我们可以使用Cookie和JWT混合认证、授权的方法来实现更加灵活和安全的身份验证和授权。本攻略将深入探讨这种方法的实现,并提供两个示例说明。 1. 混合认证、授权的基本原理 混合认证、授权的基本原理是将Cookie和JWT结合使用。当用户登录时,我们将用户信息存储在Cookie中,并将JWT作为响应的一部分返回给客户端。客户端在后续…

    C# 2023年5月17日
    00
  • C# WinForm快捷键设置技巧

    C# WinForm快捷键设置技巧 在C# WinForm程序的开发中,设置快捷键是提高用户体验的一种重要手段。本文将详细介绍如何在WinForm中设置快捷键,包括以下内容: 设置按钮控件的快捷键 设置菜单项的快捷键 设置按钮控件的快捷键 我们可以使用Button控件的UseVisualStyleBackColor属性设置快捷键。在Button控件中设置了&…

    C# 2023年6月7日
    00
  • C#编程获取实体类属性名和值的方法示例

    下面就是“C#编程获取实体类属性名和值的方法示例”的完整攻略。 什么是实体类 在使用C#编程时,有一种很常用的数据结构,就是实体类。实体类指的是一个带有属性(Property)的类,每个属性都代表了一个数据项。例如,在一个用户登录的页面中,我们可能会用到一个实体类表示用户信息,它包括用户名、密码、电子邮件地址等属性。 如何获取实体类属性名和值 在编写程序时,…

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