C# 代表树的对象
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/1806511/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Objects that represent trees
提问by Russell
Are there any objects in C# (or in .net) that represents a binary tree (or for curiosity) and n-ary tree?
C#(或.net)中是否有任何对象表示二叉树(或出于好奇)和 n 叉树?
I am not talking about presentation tree controls, but as model objects.
我不是在谈论表示树控件,而是作为模型对象。
If not, are there any good external implementations?
如果没有,是否有任何好的外部实现?
采纳答案by Bob
The NGenericsproject is a awesome collection of data structures and algorithms including a Binary Tree.
该NGenerics项目是数据结构和算法包括的真棒集合二叉树。
public class BinaryTree<T> : IVisitableCollection<T>, ITree<T>
{
// Methods
public void Add(BinaryTree<T> subtree);
public virtual void breadthFirstTraversal(IVisitor<T> visitor);
public virtual void
DepthFirstTraversal(OrderedVisitor<T> orderedVisitor);
public BinaryTree<T> GetChild(int index);
public bool Remove(BinaryTree<T> child);
public virtual void RemoveLeft();
public virtual void RemoveRight();
// ...
// Properties
public virtual T Data { get; set; }
public int Degree { get; }
public virtual int Height { get; }
public virtual bool IsLeafNode { get; }
public BinaryTree<T> this[int i] { get; }
public virtual BinaryTree<T> Left { get; set; }
public virtual BinaryTree<T> Right { get; set; }
// ...
}
回答by Yuriy Faktorovich
回答by Ohad Schneider
My attempt at a simple (non-balancing) binary search tree.
我对简单(非平衡)二叉搜索树的尝试。
public sealed class BinarySearchTree<T> : IEnumerable<T>
{
private readonly IComparer<T> _comparer;
public BinaryTreeNode<T> Root { get; private set; }
public BinarySearchTree()
{
}
public BinarySearchTree(IEnumerable<T> collection) :
this(collection, Comparer<T>.Default)
{
}
public BinarySearchTree(IEnumerable<T> collection, IComparer<T> comparer)
{
if (collection == null) throw new ArgumentNullException("collection");
if (comparer == null) throw new ArgumentNullException("comparer");
_comparer = comparer;
foreach (var item in collection)
Add(item);
}
public BinarySearchTree(BinaryTreeNode<T> root)
{
Root = root;
}
public void Add(T val)
{
var newNode = new BinaryTreeNode<T>(val);
if (Root == null)
{
Root = newNode;
return;
}
Add(Root, newNode);
}
void Add(BinaryTreeNode<T> root, BinaryTreeNode<T> node)
{
if (_comparer.Compare(node.Value, root.Value) <= 0)
{
if (root.Left == null)
root.Left = node;
else
Add(root.Left, node);
}
else //node.Value > root.Value
{
if (root.Right == null)
root.Right = node;
else
Add(root.Right, node);
}
}
public bool Contains(T val)
{
return Contains(Root, val);
}
bool Contains(BinaryTreeNode<T> node, T val)
{
if (node == null)
return false;
var comparison = _comparer.Compare(val, node.Value);
if (comparison == 0) //val = node.value
return true;
else if (comparison < 0) //val < node.Value
return Contains(node.Left, val);
else //val > node.Value
return Contains(node.Right, val);
}
public T GetMinimum()
{
if (Root == null)
return default(T);
var node = Root;
while (node.Left != null)
node = node.Left;
return node.Value;
}
public T GetMaximum()
{
if (Root == null)
return default(T);
var node = Root;
while (node.Right != null)
node = node.Right;
return node.Value;
}
public IEnumerator<T> GetEnumerator()
{
return new BinaryTreeEnumerator<T>(Root);
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
public sealed class BinaryTreeNode<T>
{
public BinaryTreeNode<T> Left {get; set;}
public BinaryTreeNode<T> Right {get; set;}
public T Value {get; private set;}
public BinaryTreeNode(T val)
{
Value = val;
}
}
public sealed class BinaryTreeEnumerator<T> : IEnumerator<T>
{
private Stack<BinaryTreeNode<T>> _stack = new Stack<BinaryTreeNode<T>>();
public T Current { get; private set; }
public BinaryTreeEnumerator(BinaryTreeNode<T> root)
{
if (root == null)
return; //empty root = Enumerable.Empty<T>()
PushLeftBranch(root);
}
public void Dispose()
{
_stack = null; //help GC
}
public bool MoveNext()
{
if (_stack.Count == 0)
return false;
var node = _stack.Pop();
Current = node.Value;
if (node.Right != null)
PushLeftBranch(node.Right);
return true;
}
private void PushLeftBranch(BinaryTreeNode<T> node)
{
while (node != null)
{
_stack.Push(node);
node = node.Left;
}
}
public void Reset()
{
_stack.Clear();
}
object IEnumerator.Current
{
get { return Current; }
}
}
回答by Eric Snyder
I am late to the party but this articlesays that SortedListand SortedDictionaryare both based on trees.
我迟到了,但这篇文章说SortedList和SortedDictionary都是基于树的。