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日

相关文章

  • C# ling to sql 取多条记录最大时间

    使用C# Ling to sql进行查询时,有时需要取多条记录中的最大时间。有以下两种方法可以实现此功能: 方法一:使用Max方法 使用Linq中的Max方法可以查询出多条记录中的最大时间。示例代码如下: using (var context = new MyDataContext()) { var maxTime = context.MyTable .Ma…

    C# 2023年6月1日
    00
  • C#编程实现四舍五入、向上及下取整的方法

    要实现四舍五入、向上及下取整的方法,可以使用C# Math类中的Round、Ceiling和Floor方法。 Round方法实现四舍五入 Round方法可以对一个浮点型数字进行四舍五入,方法的第一个参数是要处理的数字,第二个参数表示保留的小数位数。其中保留的小数位数可以为0,如果为0则Round方法将返回一个整数类型。 示例代码如下: double num1…

    C# 2023年6月6日
    00
  • C# 遍历文件夹子目录下所有图片及遍历文件夹下的文件

    C# 中遍历文件夹和子目录很常见,本文就详细讲解如何使用 C# 遍历文件夹中的文件以及子目录中的文件,同时只选择图片文件。 遍历文件夹中的所有图片文件 方法一:使用 Directory.GetFiles Directory.GetFiles() 方法返回指定路径下的所有文件,可以通过 fileName.Contains(“.jpg”) 和 fileName.…

    C# 2023年6月1日
    00
  • C#学习笔记- 浅谈数组复制,排序,取段,元组

    C#学习笔记- 浅谈数组复制,排序,取段,元组 数组复制 数组浅复制 浅复制就是复制了数组的引用,并不是数组的内容。在 C# 中,可以使用 Array 类的 Clone() 方法实现数组的浅复制。 以下示例代码演示了如何使用 Clone() 方法进行浅复制: int[] array1 = { 1, 2, 3, 4, 5 }; int[] array2 = (…

    C# 2023年6月7日
    00
  • ASP.NET Core 依赖注入生命周期示例详解

    ASP.NET Core 依赖注入生命周期示例详解攻略 在本攻略中,我们将深入讲解ASP.NET Core依赖注入生命周期,并提供两个示例说明。 什么是ASP.NET Core依赖注入生命周期? ASP.NET Core依赖注入生命周期是指在ASP.NET Core应用程序中注册和解析服务时,服务的生命周期如何管理。ASP.NET Core提供了三种生命周期…

    C# 2023年5月17日
    00
  • C#中的in参数与性能分析详解

    C#中的in参数与性能分析详解 什么是in参数 in参数是C# 7.2版本中新增的参数修饰符,用于修饰方法参数。使用in修饰符定义的方法参数将使用只读引用传递参数。只读引用传递参数是指传递的参数不能被修改,仅可读取其值。 in参数的优势 使用in参数可以提高代码的性能。如果方法的参数为值类型(比如int、double等),在方法调用时,会将这些值类型的参数按…

    C# 2023年6月7日
    00
  • ASP.NET MVC5网站开发用户登录、注销(五)

    ASP.NET MVC 5是一种基于模型-视图-控制器(MVC)模式构建Web应用程序的框架。本文将详细讲解如何在ASP.NET MVC 5网站开发中实现用户登录和注销功能。 步骤一:创建用户登录和注销的Action方法 要实现用户登录和注销功能,需要在控制器中创建Action方法。在ASP.NET MVC 5中,可以使用内置的身份验证特性来验证用户是否已经…

    C# 2023年6月3日
    00
  • C#中的GDI+图像编程详解

    “C#中的GDI+图像编程详解”是一篇介绍了GDI+在C#中的应用的技术文章,在文章中,作者详细讲述了如何使用GDI+来进行图像编程,包括图像的读取、处理、绘制等。 文章的主要内容包括: GDI+的概念及其在C#中的应用 GDI+是Windows操作系统中的图形设备接口,它可以被用于图像的读取、处理、绘制。在C#中,可以通过使用.NET框架来调用GDI+库的…

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