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

yizhihongxing

下面我将详细讲解如何用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#表达式树Expression动态创建表达式

    本文将会介绍C#表达式树(Expression)动态创建表达式的完整攻略,包括表达式树的基本概念、表达式树的创建、表达式树的编译以及完整的示例说明。 表达式树的基本概念 表达式树是一个由操作符和操作数组成的树状结构,是一种可以在运行时动态创建表达式的机制。在C#中,表达式树是由Expression命名空间中的类和枚举所组成,它们提供了创建和操作表达式树的方法…

    C# 2023年5月31日
    00
  • C#中的HttpWebRequest类介绍

    C#中的HttpWebRequest类介绍 简介 HttpWebRequest 是一个在 C# 中用来创建 HTTP 请求的类。它允许我们通过 HTTP 协议与远程服务器通信,并获取/发送数据。 使用 创建请求对象 要使用 HttpWebRequest,我们首先需要创建请求对象。可以通过以下方式进行: HttpWebRequest request = (Ht…

    C# 2023年6月1日
    00
  • 深入理解C#实现快捷键(系统热键)响应的方法

    深入理解C#实现快捷键(系统热键)响应的方法 简介 快捷键是提高操作效率的一种手段。在Windows系统中,除了软件自带的快捷键外,还可以通过系统热键实现全局快捷键。在C#中实现快捷键,需要使用Win32 API。本文将深入介绍C#实现快捷键响应的方法。 方法 C#实现快捷键响应的方法主要分为以下几步: 注册系统热键 实现热键响应函数 捕捉系统消息 销毁系统…

    C# 2023年6月7日
    00
  • ASP.NET的实用技巧详细介绍

    ASP.NET的实用技巧详细介绍 什么是ASP.NET ASP.NET 是一种用于构建 Web 应用程序的框架,它是从 ASP 框架发展而来的,是一个服务器端的 Web 应用程序框架,由微软公司开发。ASP.NET 支持多种编程语言,如 VB.NET 、C#,在 Windows 平台上运行,可以自由地创建 Web 服务和动态网页应用程序。 ASP.NET的实…

    C# 2023年6月3日
    00
  • C#的字符串比较

    C#中,字符串比较有多种方式,最常用的有三种:使用“==”比较,使用Equals方法比较,使用Compare方法比较。 使用“==”比较字符串 在C#中,可以使用“==”符号来比较两个字符串是否相等,例如: string str1 = "hello"; string str2 = "world"; string str…

    C# 2023年6月1日
    00
  • 采用easyui tree编写简单角色权限代码的方法

    下面我将为您详细讲解 “采用easyui tree编写简单角色权限代码的方法”的完整攻略,过程中将包含两条示例说明。 一、使用EasyUI Tree组件 1.1 引入EasyUI和jQuery 在使用EasyUI Tree组件前,需要先引入官方提供的EasyUI库和jQuery库。具体方法可以参考以下代码块: <!– 引入JQuery –> …

    C# 2023年6月1日
    00
  • II7添加应用程序测试时 无法验证对路径(c:\test\WcfService)的访问

    当在IIS 7上添加应用程序时,有时会遇到“无法验证对路径(c:\test\WcfService)的访问”的错误。这通常是由于IIS用户没有足够的权限来访问该路径。下面是解决此问题的完整攻略,包含两个示例。 1. 确认应用程序池的身份验证 首先,我们需要确认应用程序池的身份验证设置是否正确。在IIS管理器中,选择应用程序池,右键单击并选择“高级设置”。在“进…

    C# 2023年5月15日
    00
  • visual studio 2013常用快捷键 VS2013快捷键大全

    Visual Studio 2013常用快捷键 VS2013快捷键大全 Visual Studio 2013是一个强大的开发工具,其丰富的快捷键让开发变得更加高效。以下是一些常用快捷键和使用技巧,以帮助你更好地使用Visual Studio 2013。 常用快捷键 以下是一些常用快捷键: Ctrl + C / Ctrl + V:复制和粘贴代码或文字。 Ctr…

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