C#如何实现二叉树数据结构_C#树形结构和遍历算法教程【进阶】

穿越時空

穿越時空

2026-05-08

128人浏览

原创

不能用 winforms 的 treenode 实现算法题二叉树,因其是 ui 组件,无 left/right 字段且不支持 bst 语义;应自定义含 left、right、val 的泛型节点类,递归前必判空。

c#如何实现二叉树数据结构_c#树形结构和遍历算法教程【进阶】

别用 TreeNode 控件类来实现算法题里的二叉树——它不是数据结构,是 UI 组件。真要写遍历、搜索、插入这些逻辑,必须自定义节点类,且递归入口第一行就得判空。

为什么不能直接用 WinForms 的 TreeNode

因为 TreeNode 是 Windows Forms 里专为 TreeView 控件服务的类,它的 Nodes 属性返回的是 TreeNodeCollection,没有 left/right 字段,也不带泛型约束。你没法自然表达“左子树所有值小于当前节点”这种 BST 语义。

  • 常见错误现象:NullReferenceException 频发(尤其在遍历时访问 node.Nodes[0] 前没检查 Count
  • 遍历顺序被控件渲染逻辑干扰,比如展开状态影响 Nodes 枚举顺序
  • 无法直接用于单元测试或命令行验证,强依赖 UI 线程和控件生命周期

自定义节点类必须含 leftrightval 三个字段

推荐用可空泛型 + public 修饰符,避免封装过度带来的调用成本。BST 场景下还应加 where T : IComparable<t></t> 约束。

C函数速查手册(CHM版)
C函数速查手册(CHM版)

C函数速查手册(CHM版)

下载
  • val 别叫 DataValue——太模糊,和 .NET 内置类型冲突风险高
  • left/right 类型必须和自身一致,例如 public Node<t>? left;</t>,别用 object 或基类
  • 构造函数至少提供一个含值的重载:public Node(T val) => this.val = val;,否则初始化容易漏赋值

递归遍历三行代码位置决定前/中/后序

核心就一条:访问操作(Console.WriteLine(node.val)yield return node.val)放哪,决定了遍历类型。所有教程都强调这点,但 90% 的空引用其实出在递归调用前没判空。

  • 前序:访问 → InOrder(node.left)InOrder(node.right)
  • 中序:→ InOrder(node.left) → 访问 → InOrder(node.right)
  • 后序:→ InOrder(node.left)InOrder(node.right) → 访问
  • 每种写法开头都必须有 if (node == null) return;,缺这句,深度稍大就栈溢出

yield return 写迭代器比 List<t></t> 更合理

除非你明确需要随机索引或反复遍历,否则别一上来就 new List<int>()</int> + Add()。迭代器天然支持 .Skip(100).Take(10)、配合异步流、中断遍历等真实场景。

  • 中序迭代的关键逻辑是「压栈到底、弹出即访、转向右子树」——最后一句 curr = curr.right; 容易遗漏,漏了就会死循环
  • 栈里只存引用,不复制数据;yield return 是惰性求值,内存占用恒定 O(h),而 List 是 O(n)
  • 别在迭代器方法里做 IO 或耗时计算,否则枚举过程会卡住,且异常堆栈难定位

最常被忽略的其实是节点比较逻辑:BST 的 InsertContains 依赖 CompareTo 结果,但很多人直接用 == 判断相等,忘了 IComparable 可能返回负数/零/正数,且 null 值需单独处理。

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1103

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

2002

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1163

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

8402

23

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

1428

5

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

1482

5

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

859

5

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

530

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1061

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
RabbitMQ 教程手册
RabbitMQ 教程手册

共0课时 | 0人学习

Linux man-pages 项目
Linux man-pages 项目

共0课时 | 0人学习

C# 教程
C# 教程

共94课时 | 20.2万人学习