Csharp/C Sharp/Generics/Generic Tree

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

Generic Binary Tree

 
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);
        }
    }
}


Generic TreeNode

 


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"));
    }
}


Walk through a tree recursively

 
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();
    }
}