Advertisement
Evyatar12

Utils.cs - Binary Trees

Jan 22nd, 2018
119
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 14.04 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6.  
  7. namespace BinaryTree
  8. {
  9.     class Utils
  10.     {
  11.  
  12.         public static void printInOrderTabs<T>(BinNode<T> node, String tabs = "")
  13.         {
  14.             if (node == null)
  15.                 return;
  16.  
  17.             printInOrderTabs(node.GetLeft(), tabs + "\t");
  18.             Console.WriteLine(tabs + node.ToString());
  19.             printInOrderTabs(node.GetRight(), tabs + "\t");
  20.         }
  21.  
  22.         public static void printPreOrder<T>(BinNode<T> node)
  23.         {
  24.             if (node == null)
  25.                 return;
  26.  
  27.             Console.Write(node.GetValue().ToString() + ", ");
  28.             printPreOrder(node.GetLeft());
  29.             printPreOrder(node.GetRight());
  30.         }
  31.  
  32.         public static void printInOrder<T>(BinNode<T> node)
  33.         {
  34.             if (node == null)
  35.                 return;
  36.  
  37.             printInOrder(node.GetLeft());
  38.             Console.Write(node.GetValue().ToString() + ", ");
  39.             printInOrder(node.GetRight());
  40.         }
  41.  
  42.         public static void printPostOrder<T>(BinNode<T> node)
  43.         {
  44.             if (node == null)
  45.                 return;
  46.  
  47.             printInOrder(node.GetLeft());
  48.             printInOrder(node.GetRight());
  49.             Console.Write(node.GetValue().ToString() + ", ");
  50.         }
  51.  
  52.         static readonly int MAX_VALUE = 100;
  53.  
  54.         public static BinNode<int> createRandomTree(int points)
  55.         {
  56.             if (points <= 0)
  57.                 return null;
  58.  
  59.             Random rand = new Random();
  60.  
  61.             Func<BinNode<int>> randNode = () => new BinNode<int>(rand.Next(MAX_VALUE));
  62.             Func<bool> randBool = () => rand.Next(2) == 1;
  63.  
  64.             BinNode<int> head = randNode();
  65.  
  66.  
  67.             for (int i = 0; i < points - 1; i++)
  68.             {
  69.                 BinNode<int> curr = head;
  70.  
  71.                 while (curr.HasLeft() && curr.HasRight())
  72.                 {
  73.                     if (randBool())
  74.                         curr = curr.GetLeft();
  75.                     else
  76.                         curr = curr.GetRight();
  77.                 }
  78.  
  79.                 if (curr.HasLeft())
  80.                     curr.SetRight(randNode());
  81.                 else if (curr.HasRight())
  82.                     curr.SetLeft(randNode());
  83.                 else
  84.                 {
  85.                     if (randBool())
  86.                         curr.SetLeft(randNode());
  87.                     else
  88.                         curr.SetRight(randNode());
  89.                 }
  90.  
  91.             }
  92.  
  93.             return head;
  94.         }
  95.  
  96.         public static BinNode<int> createTree(int[] array)
  97.         {
  98.             if (array.Length == 0)
  99.                 return null;
  100.  
  101.             BinNode<int> tree = new BinNode<int>(array[0]);
  102.  
  103.             for (int i = 1; i < array.Length; i++)
  104.                 insertIntoTree(tree, array[i]);
  105.  
  106.             return tree;
  107.         }
  108.  
  109.         public static void insertIntoTree(BinNode<int> tree, int val)
  110.         {
  111.             if (tree == null || tree.GetValue() == val)
  112.                 return;
  113.  
  114.             if (tree.GetValue() > val)
  115.             {
  116.                 if (tree.HasLeft())
  117.                     insertIntoTree(tree.GetLeft(), val);
  118.                 else
  119.                     tree.SetLeft(new BinNode<int>(val));
  120.             }
  121.  
  122.             if (tree.GetValue() < val)
  123.             {
  124.                 if (tree.HasRight())
  125.                     insertIntoTree(tree.GetRight(), val);
  126.                 else
  127.                     tree.SetRight(new BinNode<int>(val));
  128.             }
  129.         }
  130.  
  131.         public static BinNode<int> getTree(int[] preorder, int[] inorder,
  132.                     int startPreorder = -2, int startInorder = -2, int length = -1)
  133.         {
  134.             // exit condition
  135.             if (startInorder >= inorder.Length || startPreorder >= inorder.Length || inorder.Length != preorder.Length)
  136.                 return null;
  137.  
  138.             // default value change
  139.             if (length == -1)
  140.             {
  141.                 length = inorder.Length;
  142.                 startInorder = 0;
  143.                 startPreorder = 0;
  144.             }
  145.  
  146.             int currentVal = preorder[startPreorder];
  147.  
  148.             int valIndex = -1;
  149.  
  150.             for (int i = startInorder; i < startInorder + length; i++)
  151.             {
  152.                 if (inorder[i].Equals(currentVal))
  153.                 {
  154.                     valIndex = i;
  155.                     break;
  156.                 }
  157.             }
  158.  
  159.             if (valIndex == -1)
  160.                 return null;
  161.  
  162.             int leftLength = valIndex - startInorder;
  163.             int rightLength = length - leftLength - 1;
  164.  
  165.             BinNode<int> node = new BinNode<int>(currentVal);
  166.             node.SetLeft(getTree(preorder, inorder, startPreorder + 1, startInorder, leftLength));
  167.             node.SetRight(getTree(preorder, inorder, startPreorder + 1 + leftLength, valIndex + 1, rightLength));
  168.  
  169.             return node;
  170.         }
  171.  
  172.         public static void printByLines<T>(BinNode<T> tree)
  173.         {
  174.             if (tree == null)
  175.                 return;
  176.  
  177.             List<BinNode<T>> curr = new List<BinNode<T>>();
  178.             curr.Add(tree);
  179.             List<BinNode<T>> next = new List<BinNode<T>>();
  180.  
  181.             while (curr.Count > 0)
  182.             {
  183.                 foreach (BinNode<T> node in curr)
  184.                 {
  185.                     if (node.HasLeft())
  186.                         next.Add(node.GetLeft());
  187.                     if (node.HasRight())
  188.                         next.Add(node.GetRight());
  189.  
  190.                     Console.Write(node + ", ");
  191.                 }
  192.  
  193.                 Console.WriteLine();
  194.  
  195.                 curr.Clear();
  196.                 curr.AddRange(next);
  197.                 next.Clear();
  198.             }
  199.         }
  200.  
  201.         public static int treeHeight<T>(BinNode<T> node)
  202.         {
  203.             if (node == null)
  204.                 return 0;
  205.  
  206.             int height = 1;
  207.  
  208.             height += Math.Max(treeHeight(node.GetLeft()), treeHeight(node.GetRight()));
  209.  
  210.             return height;
  211.         }
  212.  
  213.         public static void printHeight<T>(BinNode<T> node, int n)
  214.         {
  215.             if (node == null)
  216.                 return;
  217.  
  218.             if (n == 0)
  219.                 Console.Write(node.ToString() + ", ");
  220.             else
  221.             {
  222.                 printHeight(node.GetLeft(), n - 1);
  223.                 printHeight(node.GetRight(), n - 1);
  224.             }
  225.         }
  226.  
  227.         public static int sumRightChildren(BinNode<int> node)
  228.         {
  229.             if (node == null)
  230.                 return 0;
  231.  
  232.             return sumRightChildren(node.GetLeft()) + sumRightChildren(node.GetRight())
  233.                 + (node.HasRight() ? node.GetRight().GetValue() : 0);
  234.         }
  235.  
  236.         /// <summary>
  237.         /// gets in a node
  238.         /// sums the lone right children.
  239.         /// </summary>
  240.         /// <param name="node"></param>
  241.         /// <returns></returns>
  242.         public static int sumRightLoneChildren(BinNode<int> node)
  243.         {
  244.             if (node == null)
  245.                 return 0;
  246.  
  247.             int sum = 0;
  248.  
  249.             // if the right is the only child
  250.             if (!node.HasLeft() && node.HasRight())
  251.                 sum += node.GetRight().GetValue();
  252.  
  253.             sum += sumRightLoneChildren(node.GetLeft()) + sumRightLoneChildren(node.GetRight());
  254.  
  255.             return sum;
  256.         }
  257.  
  258.         /// <summary>
  259.         /// gets in a node
  260.         /// returns the sum of the lone children
  261.         /// </summary>
  262.         /// <param name="node"></param>
  263.         /// <returns></returns>
  264.         public static int sumLoneChildren(BinNode<int> node)
  265.         {
  266.             if (node == null)
  267.                 return 0;
  268.  
  269.             int sum = 0;
  270.  
  271.             if (node.HasRight() && !node.HasLeft())
  272.                 sum += node.GetRight().GetValue();
  273.             else if (!node.HasRight() && node.HasLeft())
  274.                 sum += node.GetLeft().GetValue();
  275.  
  276.             sum += sumLoneChildren(node.GetLeft()) + sumLoneChildren(node.GetRight());
  277.             return sum;
  278.         }
  279.  
  280.         /// <summary>
  281.         /// gets in a node
  282.         /// returns a sum of parents with single children
  283.         /// </summary>
  284.         /// <param name="node"></param>
  285.         /// <returns></returns>
  286.         public static int sumParentsWithSingleChild(BinNode<int> node)
  287.         {
  288.             if (node == null)
  289.                 return 0;
  290.  
  291.             int sum = 0;
  292.             if (node.HasRight() ^ node.HasLeft())
  293.                 sum += node.GetValue();
  294.  
  295.             return sum + sumParentsWithSingleChild(node.GetLeft()) + sumParentsWithSingleChild(node.GetRight());
  296.         }
  297.  
  298.         public static bool isParent<T>(BinNode<T> node)
  299.         {
  300.             if (node == null)
  301.                 return false;
  302.  
  303.             return node.HasRight() || node.HasLeft();
  304.         }
  305.  
  306.         public static bool isGrandparent<T>(BinNode<T> node)
  307.         {
  308.             if (node == null)
  309.                 return false;
  310.  
  311.             return isParent(node.GetRight()) || isParent(node.GetLeft());
  312.         }
  313.  
  314.         public static int sumGrandparents(BinNode<int> node)
  315.         {
  316.             if (!isGrandparent(node))
  317.                 return 0;
  318.  
  319.             return sumGrandparents(node.GetLeft()) + sumGrandparents(node.GetRight())
  320.                 + node.GetValue();
  321.         }
  322.  
  323.         public static int sumDividedBy3(BinNode<int> node)
  324.         {
  325.             if (node == null)
  326.                 return 0;
  327.  
  328.             return (node.GetValue() % 3 == 0 ? node.GetValue() : 0) + sumDividedBy3(node.GetLeft()) + sumDividedBy3(node.GetRight());
  329.         }
  330.  
  331.         public static int sumValuesLowerThan(BinNode<int> node, int max)
  332.         {
  333.             if (node == null)
  334.                 return 0;
  335.  
  336.             return (node.GetValue() < max ? node.GetValue() : 0) + sumValuesLowerThan(node.GetLeft(), max) + sumValuesLowerThan(node.GetRight(), max);
  337.         }
  338.  
  339.         private static int sumDigits(int num)
  340.         {
  341.             int sum = 0;
  342.  
  343.             while (num != 0)
  344.             {
  345.                 sum += num % 10;
  346.                 num /= 10;
  347.             }
  348.  
  349.             return sum;
  350.         }
  351.  
  352.         public static int sumOddDigitSums(BinNode<int> node)
  353.         {
  354.             if (node == null)
  355.                 return 0;
  356.  
  357.             return (sumDigits(node.GetValue()) % 2 == 1 ? node.GetValue() : 0) + sumOddDigitSums(node.GetLeft()) + sumOddDigitSums(node.GetRight());
  358.         }
  359.  
  360.         // im different
  361.  
  362.         public static int sumChildrenDoubleTheirParents(BinNode<int> node)
  363.         {
  364.             if (node == null)
  365.                 return 0;
  366.  
  367.             int doublethestakesdoublethewin = node.GetValue() * 2;
  368.             int sum = 0;
  369.  
  370.             if (node.HasRight() && node.GetRight().GetValue() >= doublethestakesdoublethewin)
  371.                 sum += node.GetRight().GetValue();
  372.  
  373.             if (node.HasLeft() && node.GetLeft().GetValue() >= 2 * doublethestakesdoublethewin)
  374.                 sum += node.GetLeft().GetValue();
  375.  
  376.             return sum + sumChildrenDoubleTheirParents(node.GetLeft()) + sumChildrenDoubleTheirParents(node.GetRight());
  377.         }
  378.  
  379.         public static int sumStronkerBrothers(BinNode<int> node)
  380.         {
  381.             if (node == null)
  382.                 return 0;
  383.  
  384.             int sum = 0;
  385.  
  386.             if (node.HasLeft() && node.HasRight() && node.GetRight().GetValue() != node.GetLeft().GetValue())
  387.             {
  388.                 if (node.GetRight().GetValue() > node.GetLeft().GetValue())
  389.                     sum += node.GetRight().GetValue();
  390.                 else
  391.                     sum += node.GetLeft().GetValue();
  392.             }
  393.  
  394.             return sum + sumStronkerBrothers(node.GetLeft()) + sumStronkerBrothers(node.GetRight());
  395.         }
  396.  
  397.         public static void doLines<T>(BinNode<T> node, Func<BinNode<T>, bool> action)
  398.         {
  399.             if (node == null)
  400.                 return;
  401.  
  402.             Queue<BinNode<T>> q = new Queue<BinNode<T>>();
  403.             q.Insert(node);
  404.  
  405.             while (!q.isEmpty())
  406.             {
  407.                 BinNode<T> curr = q.remove();
  408.  
  409.                 if (action(curr))
  410.                     break;
  411.  
  412.                 if (curr.HasLeft())
  413.                     q.Insert(curr.GetLeft());
  414.                 if (curr.HasRight())
  415.                     q.Insert(curr.GetRight());
  416.             }
  417.         }
  418.  
  419.         public static void printEvenNumsByLines(BinNode<int> node)
  420.         {
  421.             doLines(node, x =>
  422.             {
  423.                 if (x.GetValue() % 2 == 0)
  424.                     Console.WriteLine(x.GetValue());
  425.                 return false;
  426.             });
  427.         }
  428.  
  429.         public static void printParentWithSingleChild<T>(BinNode<T> node)
  430.         {
  431.             doLines(node, x =>
  432.             {
  433.                 if (node.HasRight() ^ node.HasLeft())
  434.                     Console.WriteLine(node.ToString());
  435.                 return false;
  436.             });
  437.         }
  438.  
  439.         public static void printParentSumChildrenGreater(BinNode<int> node)
  440.         {
  441.             doLines(node, x =>
  442.             {
  443.                 int sum = 0;
  444.                 sum += node.HasLeft() ? node.GetLeft().GetValue() : 0;
  445.                 sum += node.HasRight() ? node.GetRight().GetValue() : 0;
  446.                 if (sum > node.GetValue())
  447.                     Console.WriteLine(node.ToString());
  448.                 return false;
  449.             });
  450.         }
  451.  
  452.         public static bool areTreesSimiliar<T>(BinNode<T> tree1, BinNode<T> tree2)
  453.         {
  454.             if (tree1 == null || tree2 == null)
  455.                 return tree1 == null && tree2 == null;
  456.  
  457.             bool sameVals;
  458.  
  459.             if (tree1.GetValue() == null && tree2.GetValue() == null)
  460.                 sameVals = true;
  461.             else if (tree1.GetValue() != null)
  462.                 sameVals = tree1.GetValue().Equals(tree2.GetValue());
  463.             else
  464.                 sameVals = false;
  465.  
  466.             return sameVals && areTreesSimiliar(tree1.GetLeft(), tree2.GetLeft()) && areTreesSimiliar(tree1.GetRight(), tree2.GetRight());
  467.         }
  468.  
  469.  
  470.  
  471.     }
  472.  
  473. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement