Csharp/C Sharp/Generics/Generic Tree
Generic Binary Tree
<source lang="csharp"> using System; using System.Collections.Generic; using System.Linq; using System.Text; using System; using System.Collections.Generic; using System.Linq; using System.Text;
public class Tree<TItem> where TItem : IComparable<TItem> {
public Tree(TItem nodeValue) { this.NodeData = nodeValue; this.LeftTree = null; this.RightTree = null; } public void Insert(TItem newItem) { TItem currentNodeValue = this.NodeData; if (currentNodeValue.rupareTo(newItem) > 0) { if (this.LeftTree == null) { this.LeftTree = new Tree<TItem>(newItem); } else { this.LeftTree.Insert(newItem); } } else { if (this.RightTree == null) { this.RightTree = new Tree<TItem>(newItem); } else { this.RightTree.Insert(newItem); } } } public void WalkTree() { if (this.LeftTree != null) { this.LeftTree.WalkTree(); } Console.WriteLine(this.NodeData.ToString()); if (this.RightTree != null) { this.RightTree.WalkTree(); } } public TItem NodeData { get; set; } public Tree<TItem> LeftTree { get; set; } public Tree<TItem> RightTree { get; set; }
}
class Program {
static void Main(string[] args) { Tree<char> charTree = new Tree<char>("M"); InsertIntoTree<char>(charTree, "X", "A", "M", "Z", "Z", "N"); charTree.WalkTree(); } static void InsertIntoTree<T>(Tree<T> tree, params T[] data) where T : IComparable<T> { if (data.Length == 0) throw new ArgumentException("Must provide at least one data value"); foreach (T datum in data) { tree.Insert(datum); } }
}
</source>
Generic TreeNode
<source lang="csharp">
using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;
public class Employee {
private int _id = 0; private string _name = null; public Employee(int id, string name) { this._id = id; this._name = name; } public int Id { get { return this._id; } } public string Name { get { return this._name; } } public override string ToString() { return this._name; }
} public class TreeNode<T> {
private T _nodeData; private ArrayList _childNodes; public TreeNode(T nodeData) { this._nodeData = nodeData; this._childNodes = new ArrayList(); } public T Data { get { return this._nodeData; } } public TreeNode<T>[] Children { get { return (TreeNode<T>[])this._childNodes.ToArray(typeof(TreeNode<T>)); } } public TreeNode<T> this[int index] { get { return (TreeNode<T>)this._childNodes[index]; } } public TreeNode<T> AddChild(T nodeData) { TreeNode<T> newNode = new TreeNode<T>(nodeData); this._childNodes.Add(newNode); return newNode; } public override string ToString() { return this._nodeData.ToString(); }
}
class Program {
static void Main(string[] args) { TreeNode<Employee> rootNode = new TreeNode<Employee>(new Employee(111, "H")); TreeNode<Employee> child1 = rootNode.AddChild(new Employee(222, "B")); rootNode.AddChild(new Employee(333, "T")); child1.AddChild(new Employee(444, "B")); child1.AddChild(new Employee(555, "M")); }
}
</source>
Walk through a tree recursively
<source lang="csharp"> using System; using System.Collections.Generic; using System.Linq; using System.Text; using System; using System.Collections.Generic; using System.Linq; using System.Text;
public class Tree<TItem> where TItem : IComparable<TItem> {
public Tree(TItem nodeValue) { this.NodeData = nodeValue; this.LeftTree = null; this.RightTree = null; } public void Insert(TItem newItem) { TItem currentNodeValue = this.NodeData; if (currentNodeValue.rupareTo(newItem) > 0) { if (this.LeftTree == null) { this.LeftTree = new Tree<TItem>(newItem); } else { this.LeftTree.Insert(newItem); } } else { if (this.RightTree == null) { this.RightTree = new Tree<TItem>(newItem); } else { this.RightTree.Insert(newItem); } } } public void WalkTree() { if (this.LeftTree != null) { this.LeftTree.WalkTree(); } Console.WriteLine(this.NodeData.ToString()); if (this.RightTree != null) { this.RightTree.WalkTree(); } } public TItem NodeData { get; set; } public Tree<TItem> LeftTree { get; set; } public Tree<TItem> RightTree { get; set; }
} class Program {
static void Main(string[] args) { Tree<int> tree1 = new Tree<int>(10); tree1.Insert(5); tree1.Insert(1); tree1.Insert(15); tree1.Insert(-2); tree1.Insert(115); tree1.Insert(10); tree1.Insert(114); tree1.Insert(-18); tree1.Insert(1110); tree1.Insert(81); tree1.Insert(18); tree1.WalkTree(); Tree<string> tree2 = new Tree<string>("Hello"); tree2.Insert("A"); tree2.Insert("B"); tree2.Insert("C"); tree2.Insert("D"); tree2.Insert("E"); tree2.Insert("F"); tree2.Insert("G"); tree2.Insert("H"); tree2.Insert("I"); tree2.Insert("J"); tree2.Insert("K"); tree2.WalkTree(); }
}
</source>