关于C#集合想法与疑问(二)---自定义集合 C#二叉树实现
2013-05-22 20:15
399 查看
对于C#中,自定义集合,其中最重要的就是构建迭代器,不同的迭代器可以有不同的访问遍历顺序,,以下是自定义集合里二叉树的实现,仅作为例子,但是在构建中序遍历的迭代器时出现了点问题,,可能虽然了解yield return 不过是编译器给的语法糖,而实质是变异器自动产生枚举数类并根据yield return 实现IEnumerator接口,但是可能终究是理解不够,在构建中序遍历的迭代器时出现了问题,望各位大神指正: 具体细节,请看代码::
using System.IO; using System; using System.Collections.Generic; using CollectionsFuther; class Program { static void Main() { var family=new BinaryTree<string>("grandfather"); family.LeftTree=new BinaryTree<string>("Father") { Value="Father", LeftTree=new BinaryTree<string>("brother"), RightTree=new BinaryTree<string>("I") }; family.RightTree=new BinaryTree<string>("uncle") { Value="uncle", LeftTree=new BinaryTree<string>("Cousin") //RightTree=new BinaryTree<string>("I") }; Console.WriteLine("Traversing in the order of DLR (node->Left->right"); foreach(var member in family) { Console.WriteLine(member); } Console.WriteLine("Traversing in the order of DLR (left->node->right"); foreach (var member in family.MidGetEnumerator()) { Console.WriteLine(member); } Console.ReadKey(); } }
二叉树代码:
using System.Collections.Generic; using System; namespace CollectionsFuther { public class BinaryTree<T> :IEnumerable<T> { #region Properites public T Value { get; set;} public BinaryTree<T> LeftTree {get;set;} public BinaryTree<T> RightTree {get;set;} #endregion #region Constructor public BinaryTree (T value) { this.Value=value; } #endregion #region Method public bool Insert(BinaryTree<T> tree) { return true; } public bool Delete(BinaryTree<T> tree) { return true; } #region IEnumerable //Traversing in the order of node->Left->Right public IEnumerator<T> GetEnumerator() { yield return Value; if(LeftTree==null) { yield break; } else { foreach(var item in LeftTree) { yield return item; } } if(RightTree==null) { yield break; } else { foreach(var item in RightTree) { yield return item; } } } //Traversing in the order of Left->Node->Right public IEnumerable<T> MidGetEnumerator() { if(LeftTree!=null) { foreach(var item in LeftTree) { yield return item; } } yield return Value; if(RightTree!=null) { foreach(var item in RightTree) { yield return item; } } } System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { return GetEnumerator(); } #endregion #endregion } }
输出 output:
Traversing in the order of DLR (node->Left->right
grandfather
father
brother
I
uncle
cousin
Traversing in the order of DLR (left->node->right
Father
brother
I
grandfather
uncle
cousin
对于中序遍历的结果是错误的,,,求解中,,,,
相关文章推荐
- 关于c#中集合的疑问与部分想法(一)(欢迎拍砖和建议)
- 在 Visual C# .NET 中实现自定义集合
- C#使用yield关键字让自定义集合实现foreach遍历的方法
- C#使用yield关键字让自定义集合实现foreach遍历的方法
- C# 通过IEnumberable接口和IEnumerator接口实现自定义集合类型foreach功能
- 关于数据序列化(4)自定义序列化的实现,支持常用集合框架
- C# 实现Sort接口 排序自定义实体类集合
- C#实现List集合的自定义查询
- 关于c#二叉树的实现
- 行动力决定了一个人的成败,有想法,就去做! C#的内存管理原理解析+标准Dispose模式的实现
- 关于hadoop的mapreduce编程中自定义key,value建立的类实现writable接口
- C#关于伪静态页面的两种实现方法
- RichTextBox实现关键字自定义颜色显示(C#)
- C#实现集合转换成json格式数据的方法
- 多映射通用集合类(C#实现)--支持一键多值存储
- 关于VC++中,两种自定义消息的发送与接收的方法实现进行说明
- 关于源到源实现的最新想法
- c# 实现自定义窗体 加简单换肤
- C# 关于集合