/// <summary> /// Gets all subtrees with given sum. /// </summary> /// <param name="tree">The tree from which to be extracted subtrees.</param> /// <param name="sum">The sum that have to be formed by subtree sum values.</param> /// <returns>A collection of all paths in subtrees.</returns> public List<List<int>> GetAllSubtreesWithGivenSum(Tree<int> tree, int sum) { var subtreesDictionary = this.CreateDictionaryForSubtrees(tree.Nodes.ToList()); var rootNode = tree.ParentNode; subtreesDictionary[rootNode] = this.BuildSubtrees(rootNode, subtreesDictionary); var rootNodes = this.FilterSubtreesWithGivenSum(subtreesDictionary, sum); var allSubtreesWithGivenSum = this.ConnectSubtreePaths(rootNodes); return allSubtreesWithGivenSum; }
public static void Main(string[] args) { Console.WriteLine("Insert N: "); int numberOfNodes = int.Parse(Console.ReadLine()); Tree tree = new Tree(); Queue<int[]> notAdded = new Queue<int[]>(); for (int i = 0; i < numberOfNodes - 1; i++) { Console.WriteLine("Insert parent[{0}] and child[{0}] values separated: ", i); string line = Console.ReadLine(); string[] values = line.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); int parent = int.Parse(values[0]); int child = int.Parse(values[1]); if (tree.Add(parent, child) == false) { notAdded.Enqueue(new int[] { parent, child }); } } while (notAdded.Count != 0) { int[] parentChildValues = notAdded.Dequeue(); int parent = parentChildValues[0]; int child = parentChildValues[1]; if (tree.Add(parent, child) == false) { notAdded.Enqueue(parentChildValues); } } tree.ReadTree(); Console.WriteLine("=====Root====="); Console.WriteLine(tree.Root); var leadNodes = tree.GetLeafNodes(); Console.WriteLine("=====LeafNodes====="); for (int i = 0; i < leadNodes.Count; i++) { Console.WriteLine(leadNodes[i]); } var middleNodes = tree.GetMiddleNodes(); Console.WriteLine("=====MiddleNodes====="); for (int i = 0; i < middleNodes.Count; i++) { Console.WriteLine(middleNodes[i]); } Console.WriteLine(); Console.WriteLine("=====Longest path====="); Console.WriteLine(string.Join(", ", tree.GetLongestPath())); Console.WriteLine(); Console.WriteLine("=====All paths with Sum 9 ====="); tree.PrintPathsBySum(9); Console.WriteLine(); Console.WriteLine("=====All subtrees with Sum 6 ====="); tree.FindSubtreesWithGivenSum(6); Console.WriteLine(); Console.WriteLine("=====All subtrees with Sum 12 ====="); tree.FindSubtreesWithGivenSum(12); Console.WriteLine(); Console.WriteLine("=====All subtrees with Sum 21 ====="); tree.FindSubtreesWithGivenSum(21); }