C#实现二叉排序树代码实例

下面我将详细讲解如何用C#语言实现一个二叉排序树以及代码实现的具体步骤。

什么是二叉排序树?

二叉排序树(Binary Search Tree)是一种二叉树,其中树的每个节点都包含一个关键字,左子树的所有节点的关键字小于当前节点的关键字,而右子树的所有节点的关键字大于当前节点的关键字。

实现步骤

下面是实现二叉排序树的具体步骤:

  1. 创建一个树节点类,定义节点的数据类型、左右子树指针和构造函数。
public class TreeNode
{
    public int data;
    public TreeNode left;
    public TreeNode right;

    public TreeNode(int data)
    {
        this.data = data;
    }
}
  1. 编写二叉排序树类。定义一个根节点来存储整个树,以及实现插入节点、查找节点和删除节点等方法。
public class BinarySearchTree
{
    public TreeNode root;

    public BinarySearchTree()
    {
        root = null;
    }

    public void Insert(int data)
    {
        TreeNode newNode = new TreeNode(data);

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

        TreeNode current = root;
        TreeNode parent = null;

        while (true)
        {
            parent = current;

            if (data < current.data)
            {
                current = current.left;

                if (current == null)
                {
                    parent.left = newNode;
                    break;
                }
            }
            else
            {
                current = current.right;

                if (current == null)
                {
                    parent.right = newNode;
                    break;
                }
            }
        }
    }

    public TreeNode Find(int data)
    {
        if (root == null)
        {
            return null;
        }

        TreeNode current = root;

        while (current != null)
        {
            if (data == current.data)
            {
                return current;
            }

            if (data < current.data)
            {
                current = current.left;
            }
            else
            {
                current = current.right;
            }
        }

        return null;
    }

    public void Delete(int data)
    {
        root = DeleteNode(root, data);
    }

    private TreeNode DeleteNode(TreeNode root, int data)
    {
        if (root == null)
        {
            return null;
        }

        if (data < root.data)
        {
            root.left = DeleteNode(root.left, data);
        }
        else if (data > root.data)
        {
            root.right = DeleteNode(root.right, data);
        }
        else
        {
            if (root.left == null)
            {
                return root.right;
            }
            else if (root.right == null)
            {
                return root.left;
            }

            root.data = FindMin(root.right).data;
            root.right = DeleteNode(root.right, root.data);
        }

        return root;
    }

    private TreeNode FindMin(TreeNode node)
    {
        while (node.left != null)
        {
            node = node.left;
        }

        return node;
    }
}
  1. 测试代码。
BinarySearchTree bst = new BinarySearchTree();
bst.Insert(4);
bst.Insert(3);
bst.Insert(5);
bst.Insert(1);
bst.Insert(2);

TreeNode node1 = bst.Find(3);
Console.WriteLine(node1.data);    // 3

TreeNode node2 = bst.Find(6);
Console.WriteLine(node2 == null);    // True

bst.Delete(3);
TreeNode node3 = bst.Find(3);
Console.WriteLine(node3 == null);    // True

示例说明

以下是两个示例来说明二叉排序树的使用。

示例1

假设你需要在一个未排序的整数数组中查找最小的数字。你可以将整个数组构造成一个二叉排序树,然后取左子树的最后一个节点作为结果。以下是实现代码:

public int FindMin(int[] arr)
{
    BinarySearchTree bst = new BinarySearchTree();

    foreach (int num in arr)
    {
        bst.Insert(num);
    }

    TreeNode node = bst.root;
    while (node.left != null)
    {
        node = node.left;
    }

    return node.data;
}

示例2

假设你需要检查一个字符串是否是回文。你可以将这个字符串的字符构造成一个二叉排序树,并使用中序遍历来检查是否是回文。以下是实现代码:

public bool IsPalindrome(string str)
{
    BinarySearchTree bst = new BinarySearchTree();

    foreach (char ch in str)
    {
        bst.Insert((int)ch);
    }

    return CheckPalindrome(bst.root, new List<int>());
}

private bool CheckPalindrome(TreeNode node, List<int> list)
{
    if (node != null)
    {
        if (!CheckPalindrome(node.left, list))
        {
            return false;
        }

        list.Add(node.data);

        if (list.Count % 2 == 0 && list[list.Count / 2 - 1] != list[list.Count / 2])
        {
            return false;
        }

        if (!CheckPalindrome(node.right, list))
        {
            return false;
        }
    }

    return true;
}

以上就是用C#实现二叉排序树的攻略,包含了构造节点、定义类、实现方法和两个示例说明。希望对你有帮助。

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

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

相关文章

  • 在.NET Core类库中使用EF Core迁移数据库到SQL Server的方法

    在 .NET Core 类库中使用 EF Core 迁移数据库到 SQL Server 的方法 在 .NET Core 类库中使用 EF Core 迁移数据库到 SQL Server 是一种常见的操作。本攻略将介绍如何在 .NET Core 类库中使用 EF Core 迁移数据库到 SQL Server。 步骤 以下是在 .NET Core 类库中使用 EF…

    C# 2023年5月17日
    00
  • ASP.NET缓存方法分析和实践示例代码第2/2页

    下面我会详细讲解ASP.NET缓存方法分析和实践示例代码第2/2页的完整攻略。 1. 简介 缓存是提高应用程序性能的重要手段之一。ASP.NET框架提供了多种缓存方法,本文将讨论分析ASP.NET缓存方法并提供示例代码。 2. ASP.NET缓存方法分析 ASP.NET框架提供的缓存方法主要有以下几种: (1)HttpContext.Cache HttpCo…

    C# 2023年5月31日
    00
  • C#实现绘制面形图表的方法详解

    当需要在C#中实现绘制面形图表时,可以使用以下方法: 步骤1:安装NuGet包 为了使用绘图库,需要在Visual Studio中安装NuGet包,比较常用的有: OxyPlot.Wpf Live-Charts 其中 OxyPlot.Wpf 比较常用。 可以在 Visual Studio 中通过 NuGet 包管理器搜索并安装这些包。 步骤2:引用OxyPl…

    C# 2023年6月7日
    00
  • ASP.NET MVC 项目直接预览PDF文件

    ASP.NET MVC 是一种在 ASP.NET 框架下使用的 Web 应用程序框架。我们可以通过 ASP.NET MVC 将应用程序分为三个主要部分: 模型(Model)、视图(View)和控制器(Controller)。在 ASP.NET MVC 项目中,如果需要直接预览 PDF 文件,我们可以通过以下步骤来实现: 1. 生成 PDF 文件 我们可以使用…

    C# 2023年5月31日
    00
  • 解析C#的扩展方法

    以下是解析C#的扩展方法的完整攻略: 什么是C#的扩展方法? C#的扩展方法是一种特殊的静态方法,可以向已存在的类添加新的方法。使用扩展方法可以使已经封装好的类变得更加灵活,方便开发者自定义其功能。 如何定义扩展方法? 定义扩展方法需要以下几个要素: 扩展方法必须被定义在静态类中。 扩展方法必须使用this关键字作为方法的第一个参数,表示需要扩展的类型。 扩…

    C# 2023年5月15日
    00
  • C#实现pdf导出 .Net导出pdf文件

    下面我将为你详细讲解使用C#来实现PDF导出的完整攻略。 1. 前置要求 在使用C#实现PDF导出之前,我们需要先安装一个PDF生成库。在此推荐使用iTextSharp,它是一个自由开源的PDF库,具有强大的PDF文档操作和PDF文件生成功能。你可以通过NuGet包管理器来安装iTextSharp,只需要在Visual Studio中右击项目,然后选择“管理…

    C# 2023年5月15日
    00
  • C# NullReferenceException解决案例讲解

    下面是C#NullReferenceException解决案例讲解的完整攻略: 一、什么是NullReferenceException? NullReferenceException 是 .NET Framework 程序中最常出现的异常类型之一。它通常被抛出,当代码尝试使用一个值为null的对象引用,或者尝试对一个空对象进行访问。这个异常在 C# 程序中很…

    C# 2023年5月14日
    00
  • Idea自动生成Entity实现过程详解

    Idea自动生成Entity实现过程详解 在Idea开发环境中,可以使用一些插件或功能自动生成Entity类。下面是详细的实现过程: 1. 安装Lombok插件 Lombok是一款Java的轻量级插件,在Idea中使用可以省略很多冗余的代码。在Idea插件库中安装Lombok插件,安装完成后需要重启Idea。 2. 使用注解生成Entity 使用Lombok…

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