Guest User

Untitled

a guest
Sep 15th, 2020
192
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 3.72 KB | None | 0 0
  1. namespace Tree
  2. {
  3.     using System;
  4.     using System.Collections.Generic;
  5.  
  6.     public class Tree<T> : IAbstractTree<T>
  7.     {
  8.         private readonly List<Tree<T>> _children;
  9.  
  10.         public Tree(T value)
  11.         {
  12.             this.Value = value;
  13.             this.Parent = null;
  14.             this._children = new List<Tree<T>>();
  15.         }
  16.         public bool IsRootDeleted { get; private set; }
  17.         public Tree(T value, params Tree<T>[] children)
  18.             : this(value)
  19.         {
  20.             foreach (var child in children)
  21.             {
  22.                 this.Parent = this;
  23.                 this._children.Add(child);
  24.             }
  25.         }
  26.  
  27.         public T Value { get; private set; }
  28.         public Tree<T> Parent { get; private set; }
  29.         public IReadOnlyCollection<Tree<T>> Children => this._children.AsReadOnly();
  30.  
  31.         public ICollection<T> OrderBfs()
  32.         {
  33.             var result = new List<T>();
  34.             var queue = new Queue<Tree<T>>();
  35.             if (this.IsRootDeleted)
  36.             {
  37.                 return result;
  38.             }
  39.             queue.Enqueue(this);
  40.             while (queue.Count > 0)
  41.             {
  42.                 var currentEl = queue.Dequeue();
  43.                 result.Add(currentEl.Value);
  44.  
  45.                 foreach (var child in currentEl.Children)
  46.                 {
  47.                     queue.Enqueue(child);
  48.                 }
  49.  
  50.             }
  51.             return result;
  52.         }
  53.  
  54.         public ICollection<T> OrderDfs()
  55.         {
  56.             var result = new List<T>();
  57.             if (this.IsRootDeleted)
  58.             {
  59.                 return result;
  60.             }
  61.             this.Dfs(this, result);
  62.             return result;
  63.         }
  64.  
  65.        
  66.         public void AddChild(T parentKey, Tree<T> child)
  67.         {
  68.             var searchedNode = this.FindBFs(parentKey);
  69.             this.CheckEmptyNode(searchedNode);
  70.             searchedNode._children.Add(child);
  71.         }
  72.            
  73.        
  74.         public void RemoveNode(T nodeKey)
  75.         {
  76.             var currentNode = this.FindBFs(nodeKey);
  77.             this.CheckEmptyNode(currentNode);
  78.  
  79.             foreach (var child in currentNode.Children)
  80.             {
  81.                 child.Parent = null;
  82.             }
  83.             currentNode._children.Clear();
  84.             var parent = currentNode.Parent;
  85.             if (parent is null)
  86.             {
  87.                 this.IsRootDeleted = true;
  88.             }
  89.             else
  90.             {
  91.                 parent._children.Remove(currentNode);
  92.             }
  93.             currentNode.Value = default(T);
  94.         }
  95.  
  96.         public void Swap(T firstKey, T secondKey)
  97.         {
  98.             throw new NotImplementedException();
  99.         }
  100.  
  101.         private Tree<T> FindBFs(T value)
  102.         {
  103.  
  104.             var queue = new Queue<Tree<T>>();
  105.             queue.Enqueue(this);
  106.             while (queue.Count > 0)
  107.             {
  108.                 var subtree = queue.Dequeue();
  109.                 if (subtree.Value.Equals(value))
  110.                 {
  111.                     return subtree;
  112.                 }
  113.                 foreach (var child in subtree.Children)
  114.                 {
  115.                     queue.Enqueue(child);
  116.                 }
  117.             }
  118.             return null;
  119.         }
  120.         private void Dfs(Tree<T> subTree, List<T> result)
  121.         {
  122.  
  123.             foreach (var child in subTree.Children)
  124.             {
  125.                 this.Dfs(child, result);
  126.             }
  127.             result.Add(subTree.Value);
  128.         }
  129.         private void CheckEmptyNode(Tree<T> searchedNode)
  130.         {
  131.             if (searchedNode is null)
  132.             {
  133.                 throw new ArgumentNullException("Node not found!");
  134.             }
  135.         }
  136.     }
  137. }
  138.  
Add Comment
Please, Sign In to add comment