static int MaxPathSum(Node root, MaxPath mp) { if (root == null) { return(0); } int lsum = MaxPathSum(root.Left, mp); int rsum = MaxPathSum(root.Right, mp); int maxOfChilds = Math.Max(lsum, rsum); int maxwithRoot = Math.Max(root.value, root.value + maxOfChilds); int sumOfallthree = lsum + rsum + root.value; int maxpathSumFortheRoot = Math.Max(maxwithRoot, sumOfallthree); //Now compare with what we have in the reference object if (mp.Value < maxpathSumFortheRoot) { mp.Value = maxpathSumFortheRoot; } //now return the max path so far return(maxwithRoot); }
static void Main(string[] args) { Node n1 = new Node(1); Node n2 = new Node(2); Node n3 = new Node(3); Node n4 = new Node(4); Node n5 = new Node(5); Node n6 = new Node(6); Node n7 = new Node(7); Node n8 = new Node(8); Node n9 = new Node(9); Node n10 = new Node(10); n1.Left = n2; n1.Right = n3; n2.Left = n4; n2.Right = n5; n3.Left = n6; n3.Right = n7; n6.Left = n8; n7.Right = n9; n4.Left = n10; Console.WriteLine($"{9} is {GetLevel(n1, 9, 0)}"); Console.WriteLine($"{1} is {GetLevel(n1, 1, 0)}"); Console.WriteLine($"{20} is {GetLevel(n1, 20, 0)}"); Console.WriteLine($"LCA of {n8.value} and {n9.value} is :{FindLCA(n1, n8.value, n9.value).value}"); var res = FindLCA(n1, 20, 30); Console.WriteLine($"LCA of {n8.value} and {n9.value} is :{res?.value}"); Console.WriteLine($"LCA of {n4.value} and {n9.value} is :{FindLCA(n1, n4.value, n9.value).value}"); // Console.WriteLine($"LCA of {n6.value} {n8.value} and {n9.value} is :{FindLCA(n1, new List<int> { 6,8,9 }).value}"); Console.WriteLine($"LCA of {n6.value} {n8.value} and {n9.value} is :{FindLCAOfListOfNodes(n1, new List<Node> { n6,n8,n9}).value}"); Console.WriteLine($"LCA of {n4.value} {n6.value} and {n9.value} is :{FindLCAOfListOfNodes(n1, new List<Node> { n4, n6, n9 }).value}"); Console.WriteLine($"LCA of {n6.value} {n8.value} and {n3.value} is :{FindLCAOfListOfNodes(n1, new List<Node> { n6, n8 ,n3 }).value}"); //Console.WriteLine($"LCA of {n3.value} and {n9.value} is :{FindLCA(n1, n3.value, n9.value).value}"); //Console.WriteLine($"LCA of {n3.value} and {n9.value} is :{FindLCA(n1, n3.value, n9.value).value}"); //Console.WriteLine($"LCA of {n3.value} and {n9.value} is :{FindLCA(n1, n3.value, n9.value).value}"); //PrintRelation(n1, 8, 9); PrintRelation(n1, 6, 7); PrintRelation(n1, 3, 7); PrintRelation(n1, 7, 3); PrintRelation(n1, 3, 9); PrintRelation(n1, 9, 3); PrintRelation(n1, 1, 9); PrintRelation(n1, 9, 1); PrintRelation(n1, 4, 9); PrintRelation(n1, 10, 9); PrintRelation(n1, 20, 30); MaxPath mp = new MaxPath(); MaxPathSum(n1, mp); Console.WriteLine($"Max Path Sum = {mp.Value }"); Node n_10 = new Node(10); Node n_2 = new Node(2); Node n2nd_10 = new Node(10); Node n_20 = new Node(20); Node n_1 = new Node(1); Node n_25 = new Node(-25); Node n_3 = new Node(3); Node n_4 = new Node(4); //http://www.geeksforgeeks.org/find-maximum-path-sum-in-a-binary-tree/ n_10.Left = n_2; n_10.Right = n2nd_10; n_2.Left = n_20; n_2.Right = n_1; n2nd_10.Right = n_25; n_25.Left = n_3; n_25.Right = n_4; mp = new MaxPath(); MaxPathSum(n_10, mp); Console.WriteLine($"Max Path Sum = {mp.Value }"); Console.ReadKey(); }