C#使用TreeView控件实现的二叉树泛型节点类及其方法

 更新时间:2024年03月11日 10:27:21   作者:wenchm  
TreeView 控件在 C# 中主要用于显示分层结构的数据,这通常是一个文件系统的表示,但也可以是任何具有父子关系的数据集合,本文给大家介绍了C#使用TreeView控件实现的二叉树泛型节点类及其方法,需要的朋友可以参考下

一、涉及到的知识点

1.TreeView控件

TreeView 控件在 C# 中主要用于显示分层结构的数据。这通常是一个文件系统的表示,但也可以是任何具有父子关系的数据集合。TreeView 控件在 Windows Forms 应用程序中非常常见,允许用户通过点击箭头来展开或折叠节点,以查看或隐藏子节点。

在 C# Windows Forms 应用程序中使用 TreeView 控件的基本步骤:

(1)添加 TreeView 控件到 Form:

在设计视图中,从工具箱中拖动 TreeView 控件到 Form 上。

或者在代码中,使用 Controls.Add 方法将 TreeView 添加到 Form。

(2)添加节点:

使用 Nodes 属性添加根节点。

使用 Nodes.Add 方法为根节点添加子节点。

也可以为子节点再添加子节点,形成多级层次结构。

(3)为节点添加文本和图像:

使用 Text 属性为节点设置文本。

使用 ImageIndex 和 SelectedImageIndex 属性为节点设置图像。这些属性通常与 ImageList 控件结合使用,后者可以包含要在 TreeView 中显示的图像。

(4)事件处理:

AfterSelect:当用户选择一个节点后触发。

BeforeSelect:在用户选择一个节点之前触发,允许你取消选择。

NodeMouseClick:当用户点击一个节点时触发。

其他事件,如 AfterExpand、BeforeExpand 等。

(5)自定义外观和行为:

通过设置 TreeView 的属性,如 LineColor、ExpandCollapseColor、ScrollAlwaysVisible 等,可以自定义其外观和行为。

2.TreeView控件的应用示例

该实例展示了如何在 Windows Forms 应用程序中添加一个 TreeView 控件并为其添加节点:

// Form1.cs
namespace _135_8
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            treeView1!.Nodes.Add("根节点1");
            treeView1.Nodes[0].Nodes.Add("子节点1");
            treeView1.Nodes[0].Nodes.Add("子节点2");
            treeView1.Nodes.Add("根节点2");
        }
 
        private void TreeView1_AfterSelect(object? sender, TreeViewEventArgs e)
        {
            MessageBox.Show("你选择了节点: " + e.Node!.Text);
        }
    }
}
//Form1.Designer.cs
namespace _135_8
{
    partial class Form1
    {
        /// <summary>
        ///  Required designer variable.
        /// </summary>
        private System.ComponentModel.IContainer components = null;
 
        /// <summary>
        ///  Clean up any resources being used.
        /// </summary>
        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }
 
        #region Windows Form Designer generated code
 
        /// <summary>
        ///  Required method for Designer support - do not modify
        ///  the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            treeView1 = new TreeView();
            SuspendLayout();
            // 
            // treeView1
            // 
            treeView1.Dock = DockStyle.Fill;
            treeView1.Location = new Point(0, 0);
            treeView1.Name = "treeView1";
            treeView1.Size = new Size(284, 181);
            treeView1.TabIndex = 0;
            treeView1.AfterSelect += TreeView1_AfterSelect;
            // 
            // Form1
            // 
            AutoScaleDimensions = new SizeF(7F, 17F);
            AutoScaleMode = AutoScaleMode.Font;
            ClientSize = new Size(284, 181);
            Controls.Add(treeView1);
            Name = "Form1";
            StartPosition = FormStartPosition.CenterScreen;
            Text = "Form1";
            Load += Form1_Load;
            ResumeLayout(false);
        }
 
        #endregion
        private TreeView treeView1;
    }
}

这个例子创建了一个简单的 TreeView,有两个根节点,其中一个根节点有两个子节点。当用户选择一个节点时,会显示一个消息框,显示所选择的节点的文本。

3.使用TreeView控件实现的二叉树类及其方法的可行性

在C#中,TreeView 控件通常用于展示层次结构的数据,但它并不直接支持二叉树结构。TreeView 的节点(TreeNode)类并不限制其子节点的数量,这意味着你可以为每个节点添加任意数量的子节点,这更适合于表示一般的树形结构而不是二叉树。

然而,如果想用 TreeView 控件来展示二叉树,可以自定义一个二叉树类,然后将其转换为 TreeView 可以表示的形式。

二、使用TreeView控件实现的二叉树类及其方法

创建一个C#的Windows Forms应用程序,并在这个应用程序中包含一个BinaryTree类和一个窗体(Form1),该窗体包含一个TreeView控件来显示二叉树的内容。

下面是一个简化的示例程序,它包括了一个基本的BinaryTree类和一个使用TreeView控件来显示二叉树的Windows Forms窗体。

1.首先,定义BinaryTree类和BinaryTreeNode类:

/// <summary>
/// 定义BinaryTreeNode<T>类
/// 泛型约束:可比较
/// </summary>
public class BinaryTreeNode<T>(T value) where T : IComparable<T>
{
    public T Value { get; set; } = value;
    public BinaryTreeNode<T>? Left { get; set; } = null;
    public BinaryTreeNode<T>? Right { get; set; } = null;
}
/// <summary>
/// 定义BinaryTree<T>类
/// 泛型约束:可比较
/// </summary>
public class BinaryTree<T> where T : IComparable<T>
{
    private BinaryTreeNode<T>? _root;
 
    public BinaryTree()
    {
        _root = null;
    }
 
    /// <summary>
    /// 添加节点的Add(T value)方法
    /// </summary>
    public void Add(T value)
    {
        _root = BinaryTree<T>.Add(value, _root!);
    }
 
    private static BinaryTreeNode<T> Add(T value, BinaryTreeNode<T> currentNode)
    {
        if (currentNode == null)
        {
            return new BinaryTreeNode<T>(value);
        }
 
        if (value.CompareTo(currentNode.Value) < 0)
        {
            currentNode.Left = BinaryTree<T>.Add(value, currentNode.Left!);
        }
        else if (value.CompareTo(currentNode.Value) > 0)
        {
            currentNode.Right = BinaryTree<T>.Add(value, currentNode.Right!);
        }
 
        return currentNode;
    }
 
    /// <summary>
    /// 将二叉树转换为 TreeView 控件的节点
    /// </summary>
    public void PopulateTreeView(TreeView treeView)
    {
        treeView.Nodes.Clear();
        if (_root != null)
        {
            treeView.Nodes.Add(BinaryTree<T>.CreateTreeNode(_root));
        }
    }
 
    private static TreeNode CreateTreeNode(BinaryTreeNode<T> node)
    {
        TreeNode treeNode = new(node.Value.ToString());
        if (node.Left != null)
        {
            treeNode.Nodes.Add(BinaryTree<T>.CreateTreeNode(node.Left));// 递归添加左子树
        }
        if (node.Right != null)
        {
            treeNode.Nodes.Add(BinaryTree<T>.CreateTreeNode(node.Right));// 递归添加右子树
        }
        return treeNode;
    }
}

2.接着,创建窗体Form1并添加一个TreeView控件:

 public partial class Form1 : Form
 {
     private BinaryTree<int>? binaryTree;
 
     public Form1()
     {
         InitializeComponent();
         //binaryTree = new BinaryTree<int>();
     }
 
     private void Form1_Load(object sender, EventArgs e)
     {
         // 初始化二叉树并添加节点
         binaryTree = new BinaryTree<int>();
         binaryTree.Add(5);
         binaryTree.Add(3);
         binaryTree.Add(7);
         binaryTree.Add(2);
         binaryTree.Add(4);
         binaryTree.Add(6);
         binaryTree.Add(8);
 
         treeView1.Refresh();
         // 将二叉树转换为 TreeView 控件的节点并显示
         binaryTree.PopulateTreeView(treeView1);
     }
 }

3.运行结果

把上面两个类放在同一个命名空间下,运行结果:

以上就是C#使用TreeView控件实现的二叉树泛型节点类及其方法的详细内容,更多关于C# TreeView二叉树类的资料请关注脚本之家其它相关文章!

相关文章

  • WPF通过使用C#代码给控件赋值

    WPF通过使用C#代码给控件赋值

    开发中偶尔会用到使用c#代码给控件赋值,这里需要通过F12找到控件的赋值类型,然后在看控件可以使用那种方式赋值,花点时间研究一下,基本都可以通过c#代码给控件赋值的,需要的朋友可以参考下
    2023-09-09
  • WPF实现动画效果(五)之关键帧动画

    WPF实现动画效果(五)之关键帧动画

    这篇文章介绍了WPF实现动画效果之关键帧动画,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • C# WinForm导出Excel方法介绍

    C# WinForm导出Excel方法介绍

    在.NET应用中,导出Excel是很常见的需求,导出Excel报表大致有以下三种方式:Office PIA,文件流和NPOI开源库,本文只介绍前两种方式
    2013-12-12
  • 提取HTML代码中文字的C#函数

    提取HTML代码中文字的C#函数

    提取HTML代码中文字的C#函数...
    2007-03-03
  • 浅谈C# 中的委托和事件

    浅谈C# 中的委托和事件

    本篇文章主要介绍C# 中的委托和事件,委托和事件在 .Net Framework中的应用非常广泛,有兴趣的可以了解一下。
    2016-12-12
  • C#索引器简单实例代码

    C#索引器简单实例代码

    打开.Net Framework源代码随便看几个类,就会发现索引器的影子。索引器可以被重载,可以接收一个或者多个参数,但是不可以定义为静态的。可以用关联数组的方式访问索引器。
    2013-03-03
  • C# 复制与删除文件的实现方法

    C# 复制与删除文件的实现方法

    这篇文章主要介绍了C# 复制与删除文件的实现方法的相关资料,希望通过本文能帮助到大家,让大家理解掌握这部分内容,需要的朋友可以参考下
    2017-10-10
  • C#实现的UDP收发请求工具类实例

    C#实现的UDP收发请求工具类实例

    这篇文章主要介绍了C#实现的UDP收发请求工具类,结合具体实例形式分析了C#针对UDP请求的监听、接收、发送等相关操作技巧,需要的朋友可以参考下
    2017-06-06
  • C#实现对文件进行加密保护的示例代码

    C#实现对文件进行加密保护的示例代码

    这篇文章主要为大家详细介绍了如何利用C#实现对文件进行加密保护的功能,文中的示例代码讲解详细,对我们学习C#有一定的帮助,感兴趣的小伙伴可以跟随小编一起了解一下
    2022-12-12
  • C# Winform 实现控件自适应父容器大小的示例代码

    C# Winform 实现控件自适应父容器大小的示例代码

    这篇文章主要介绍了C# Winform 实现控件自适应父容器大小的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03

最新评论