private string Subdescribe(Node node, int count) { string result = ""; result += Environment.NewLine; string spaces = ""; for (int i = 0; i < count; i++) { spaces += " "; } result += spaces; if (node as NoChildrenNode != null) { NoChildrenNode ncn = (NoChildrenNode)node; result += "new NoChildrenNode(" + node.Name + ")"; } else if (node as SingleChildNode != null) { SingleChildNode scn = (SingleChildNode)node; result += "new SingleChildNodef(" + node.Name + ","; result += Subdescribe(scn.Child, count + 1); result += ")"; } else if (node as TwoChildrenNode != null) { TwoChildrenNode wcn = (TwoChildrenNode)node; result += "new TwoChildrenNode(" + node.Name + ","; result += Subdescribe(wcn.FirstChild, count + 1); result += Subdescribe(wcn.SecondChild, count + 1); result += ")"; } else if (node as ManyChildrenNode != null) { ManyChildrenNode mcn = (ManyChildrenNode)node; List <Node> child = mcn.Children.ToList(); result += "new ManyChildrenNode(" + node.Name + ","; foreach (var cnode in child) { result += Subdescribe(cnode, count + 1); } result += ")"; } return(result); }
public Node Transform(Node node) { if (node as NoChildrenNode != null) { return(node); } else if (node as ManyChildrenNode != null) { ManyChildrenNode mcd = (ManyChildrenNode)node; if (mcd.Children.Count() > 2) { ManyChildrenNode root = new ManyChildrenNode(mcd.Name, mcd.Children.ToArray()); foreach (var cnode in mcd.Children) { Transform(cnode); } return(root); } else if (mcd.Children.Count() == 2) { List <Node> lchildren = mcd.Children.ToList(); TwoChildrenNode tcn = new TwoChildrenNode(mcd.Name, Transform(lchildren[0]), Transform(lchildren[1])); return(tcn); } else if (mcd.Children.Count() == 1) { List <Node> child = mcd.Children.ToList(); //Transform(child[0]); SingleChildNode scn = new SingleChildNode(mcd.Name, Transform(child[0])); return(scn); } else { NoChildrenNode ncn = new NoChildrenNode(mcd.Name); return(ncn); } } else if (node as TwoChildrenNode != null) { TwoChildrenNode tcd = (TwoChildrenNode)node; if ((tcd.FirstChild != null) && (tcd.SecondChild != null)) { TwoChildrenNode ntcn = new TwoChildrenNode(tcd.Name, tcd.FirstChild, tcd.SecondChild); Transform(ntcn.FirstChild); Transform(ntcn.SecondChild); return(ntcn); } else if ((tcd.FirstChild == null) && (tcd.SecondChild == null)) { NoChildrenNode ncn = new NoChildrenNode(tcd.Name); return(ncn); } else if ((tcd.FirstChild == null) || (tcd.SecondChild == null)) { SingleChildNode scn; if (tcd.FirstChild != null) { scn = new SingleChildNode(tcd.Name, tcd.FirstChild); } else { scn = new SingleChildNode(tcd.Name, tcd.SecondChild); } Transform(scn); return(scn); } } else if (node as SingleChildNode != null) { SingleChildNode scn = (SingleChildNode)node; if (scn.Child == null) { NoChildrenNode ncn = new NoChildrenNode(scn.Name); return(ncn); } Transform(scn); return(scn); } return(node); }