///<summary>Создать дерево с указанным корнем.</summary> public LinkedTree(LinkedNode <T> n) { n.Parent = null; _r = n; _visitor = new NRVisitor <T>(); _count = 0; __ComputeC(ref _count); }
///<summary>Добавить новый узел с содержимым item ///к указанному узлу дерева. ///</summary> public void AddTo(Node <T> n, T item) { LinkedNode <T> p = n as LinkedNode <T>; LinkedNode <T> it = new LinkedNode <T>(); it.Value = item; it.Parent = p; _count += 1; p.Children.Add(it); }
///<summary>Добавить новый узел с содержимым item ///к самому левому листу дерева. ///</summary> public void Add(T item) { LinkedNode <T> n = _r; while (n.Children.Count != 0) { n = n.Children[0];//LEFTMOST_CHILD } AddTo(n, item); }
///<summary>Первый сын узла (LinkedNode<typeparamref name="T"/>)</summary> public Node <T> LeftMostChild(Node <T> node) { LinkedNode <T> np = node as LinkedNode <T>; if (np == null || np.Children == null || np.Children.Count == 0) { return(null); } return(np.Children[0]); }
///<summary>Родитель узла. (LinkedNode<typeparamref name="T"/>)</summary> public Node <T> Parent(Node <T> node) { LinkedNode <T> np = node as LinkedNode <T>; if (np == null || np.Parent == null) { return(null); } return(np.Parent); }
///<summary>Получить последнего сына указанного узла.</summary> public Node <T> RightMostChild(Node <T> n) { LinkedNode <T> c = n as LinkedNode <T>; if (c == null || c.Children.Count == 0) { return(null); } return(c.Children[c.Children.Count - 1]); }
///<summary>Получить список детей указанного узла.</summary> public IList <Node <T> > GetChildren(Node <T> n) { LinkedNode <T> c = n as LinkedNode <T>; List <Node <T> > l = new List <Node <T> >(); for (Int32 i = 0; i < c.Children.Count; i++) { l.Add(c.Children[i]); } return(l); }
///<summary>Правый брат узла (LinkedNode<typeparamref name="T"/>)</summary> public Node <T> RightSibling(Node <T> node) { LinkedNode <T> np = node as LinkedNode <T>; if (np == null || np.Parent == null) { return(null); } LinkedNode <T> parent = np.Parent; List <LinkedNode <T> > c = parent.Children; Int32 i = 0; while (!c[i].Equals(np)) { i++; } if (i >= c.Count - 1) { return(null); } return(c[i + 1]); }
///<summary>Удалить все узлы дерева. (Корень сохранится, но не будет ничего содержать)</summary> public void Clear() { _r = null; _r = new LinkedNode <T>(); _count = 0; }
///<summary>Создать пустое дерево (с корнем без содержимого)</summary> public LinkedTree() { _r = new LinkedNode <T>(); _visitor = new NRVisitor <T>(); _count = 1; }
///<summary>Получить поддерево с корнем n указанного узла дерева.</summary> public IPositionalTree <T> GetSubTree(Node <T> n) { LinkedNode <T> ln = n as LinkedNode <T>; return(new LinkedTree <T>(ln)); }