{
public int Id { get; set; }
public String Name { get; set; }
public String Parent { get; set; }
[JsonIgnore]
public bool Visited { get; set; }
[JsonIgnore]
public List
}
public static class TreeManager
{
static Node tree = null;
static TreeManager()
{
tree = new Node();
}
public static Node Get()
{
return tree;
}
}
public static class TestData
{
static int id = 1;
public static Node Initialise()
{
var root = TreeManager.Get();
root.Id = Identifier;
root.Name = "Root";
root.Children = CreateDepartment();
CreateChildren(root.Children, "aisle");
CreateChildren(root.Children.SelectMany(c => c.Children).ToList(), "shelve");
//CreateChildren(root.Children.SelectMany(c => c.Children).SelectMany(c => c.Children).ToList(), "sub_shelve");
return root;
}
private static int Identifier
{
get
{
return id++;
}
}
private static List
{
string[] departments = new string[]
{
"Fresh Food", "Level 1 Mos Test", "Food cupboard test",
"Frozen food", "Drinks", "Drugstore", "Baby", "Pets", "Home and entertainment"
};
return Create(departments);
}
private static void CreateChildren(List
{
Random seeder = new Random(1);
foreach (var node in nodes)
{
int looper = seeder.Next(1, 10);
List
while ((looper--) > 0)
{
names.Add(node.Name + "-" + childName + looper.ToString());
}
node.Children = new List
node.Children.AddRange(Create(names.ToArray()));
}
}
private static List
{
List
foreach (var name in names)
{
nodes.Add(new Node { Id = Identifier, Name = name });
}
return nodes;
}
}
//http://www.codeproject.com/Articles/32212/Introduction-to-Graph-with-Breadth-First-Search-BF
//http://stackoverflow.com/questions/687731/breadth-first-vs-depth-first
public static class DFSTraverse
{
static List
public static void Traverse(Node tree)
{
orderedNodes.Clear();
Stack
tree.Visited = true;
Push(stack, tree);
Print(stack.Peek());
while (!stack.IsEmpty())
{
Node node = GetChildNode(stack.Peek());
if (node == null) stack.Pop();
else
{
node.Visited = true;
Push(stack, node, stack.Peek().Name);
Print(stack.Peek());
}
}
}
public static string OrderedList()
{
return JsonConvert.SerializeObject(orderedNodes);
}
public static Node RebuildHierarchy(Stack
{
Node root = stack.Peek();
BuildHierarchy(stack, stack.Pop());
return root;
}
private static void BuildHierarchy(Stack
{
if (parent == null) return;
Node addedNode = null;
while (!stack.IsEmpty())
{
if (stack.Peek().Parent.Equals(parent.Name))
{
if (parent.Children == null) parent.Children = new List
addedNode = stack.Pop();
parent.Children.Add(addedNode);
}
else if (stack.Peek().Parent.Equals(addedNode.Name)) BuildHierarchy(stack, addedNode);
else return;
}
}
private static void AddToOrderedList(Node node)
{
orderedNodes.Add(node);
}
private static void Push(Stack
{
stack.Push(node);
node.Parent = parent;
AddToOrderedList(node);
}
private static Node GetChildNode(Node node)
{
if (!node.Visited) return node;
if (node.Children == null) return null;
return node.Children.FirstOrDefault(n => n.Visited == false);
}
private static void Print(Node node)
{
Console.WriteLine(node.Id + ":" + node.Name);
}
private static bool IsEmpty
{
return stack.Count <= 0;
}
}
class Program
{
const string file = "Naviagtion.txt";
static void DemoDFSTraverse(Node root)
{
DFSTraverse.Traverse(root);
if (File.Exists(file)) File.Delete(file);
File.WriteAllText(file, DFSTraverse.OrderedList());
}
static Node RebuildHierarchy()
{
var result = JsonConvert.DeserializeObject
Stack
return DFSTraverse.RebuildHierarchy(node);
}
static bool AreEquals(Node node1, Node node2)
{
if (node1.Id == node2.Id && node1.Name.Equals(node2.Name))
{
int item = 0;
if (node1.Children == null && node2.Children == null) return true;
foreach (var node in node1.Children)
{
var otherNode1 = node1.Children[item];
var otherNode2 = node2.Children[item];
item++;
return AreEquals(otherNode1, otherNode2);
}
}
return false;
}
static void Main(string[] args)
{
Node originalNode = TestData.Initialise();
DemoDFSTraverse(originalNode);
Node rebuilededNode = RebuildHierarchy();
Console.WriteLine(AreEquals(originalNode, rebuilededNode));
Console.Clear();
DemoDFSTraverse(rebuilededNode);
Console.ReadLine();
}