Q
表示樹的對象
19
A
回答
20
NGenerics項目是一個很棒的數據結構和算法集合,包括Binary Tree。
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; }
// ...
}
6
我不知道在框架中的一個,但here是一個實現。
5
我試圖在一個簡單的(非平衡)二叉搜索樹。
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; }
}
}
+0
這個如果它實現了IEnumerable接口,使它變得與LINQ兼容並且數據結構轉換 – 2013-06-23 21:02:22
+1
我實際上已經實現它,那麼它會非常有用 – 2013-06-24 19:54:15
相關問題
- 1. 表達式樹可以表示一個對象或該對象的列表?
- 2. 對話樹xml表示法作爲java對象
- 3. 基於json對象樹的html表
- 4. 替換對象樹中的對象
- 5. 用於創建表示樹的節點的對象代表Ruby的父母
- 6. 表示層對象
- 7. JSON對象表示
- 8. C++對象表示
- 9. C#對象表示
- 10. 製作樹對象
- 11. XML與對象樹
- 12. 遍歷對象樹
- 13. 使用對象列表構建樹
- 14. 表達式樹複製對象
- 15. 表達式樹,對象比較器
- 16. C#路徑列表樹與對象
- 17. CAST函數表達式樹從對象
- 18. C++對象的XML表示
- 19. HTML對象的Java表示
- 20. JSON對象的Java表示
- 21. 對象的內部表示
- 22. 從對象列表中遞歸創建對象樹結構
- 23. 使用c的對象樹?
- 24. Javascript對象編程和對象表示
- 25. 的Plone:示對導航樹
- 26. 顯示對象列表
- 27. 其資源表示對象:
- 28. TextBlock顯示對象列表
- 29. 圖和樹表示
- 30. 解壓縮git樹對象
+1良好的好奇心 – Bob 2009-11-27 02:47:30