Csharp/C Sharp/Generics/Generic Tree

Материал из .Net Framework эксперт
Перейти к: навигация, поиск

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>