Saurik

UsefulMethods (C#)

Apr 3rd, 2014
21,630
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 24.71 KB | None | 0 0
  1. using System;
  2. //using System.Collections.Generic;
  3. using Unit4.CollectionsLib;
  4.  
  5. namespace ConsoleApplication1
  6. {
  7.     class UsefulMethods
  8.     {
  9.         /* הערות:
  10.         * מחלקת עזר זו כוללת פעולות עזר על רשימה, מחסנית, תור ועץ בינארי
  11.         * לכל פעולה כתובות מעליה (כהערות) טענת הכניסה, טענת היציאה וסיבוכיות זמן הריצה של הפעולה
  12.         * הערה עם סימן קריאה משמעה פעולה חיצונית שקיימת במחלקת עזר זו - יש לכתוב את הפעולה החיצונית!
  13.         * רוב הפעולות מקבלות טיפוס נתונים מסוג מספר שלם, אך יכולות לעבוד עם כל טיפוס אחר
  14.         * © כל הזכויות שמורות לערן - Saurik
  15.         * לבקשות, הערות והצעות: http://www.fxp.co.il/showthread.php?t=14343465
  16.         * בהצלחה בבחינות!
  17.         */
  18.  
  19.  
  20.         ///
  21.         /// רשימה
  22.         ///
  23.         //טענת כניסה: הפעולה מקבלת רשימה של מספרים שלמים ומספר שלם
  24.         // טענת יציאה: הפעולה מחזירה "אמת" אם המספר נמצא ברשימה, אחרת מחזירה "שקר"
  25.         // סיבוכיות זמן ריצה: O(n)
  26.         public static bool IsExistList(List<int> l, int n)
  27.         {
  28.             Node<int> pos = l.GetFirst();
  29.             while (pos != null)
  30.             {
  31.                 if (pos.GetInfo() == n)
  32.                     return true;
  33.                 pos = pos.GetNext();
  34.             }
  35.             return false;
  36.         }
  37.         // טענת כניסה: הפעולה מקבלת רשימה של מספרים שלמים
  38.         // טענת כניסה: הפעולה מחזירה את סכום כל איברי הרשימה
  39.         // סיבוכיות זמן ריצה: O(n)
  40.         public static int SumList(List<int> l)
  41.         {
  42.             int sum = 0;
  43.             Node<int> pos = l.GetFirst();
  44.             while (pos != null)
  45.             {
  46.                 sum += pos.GetInfo();
  47.                 pos = pos.GetNext();
  48.             }
  49.             return sum;
  50.         }
  51.         // טענת כניסה: הפעולה מקבלת רשימה של מספרים שלמים
  52.         // טענת יציאה: הפעולה מחזירה את אורך הרשימה - מספר החוליות בה
  53.         // סיבוכיות זמן ריצה: O(n)
  54.         public static int LengthList(List<int> l)
  55.         {
  56.             int length = 0;
  57.             Node<int> pos = l.GetFirst();
  58.             while (pos != null)
  59.             {
  60.                 length++;
  61.                 pos = pos.GetNext();
  62.             }
  63.             return length;
  64.         }
  65.         // טענת כניסה: הפעולה מקבלת רשימה של מספרים שלמים ומספר שלם
  66.         // טענת יציאה: הפעולה מחזירה את מספר הפעמים שהמספר מופיע ברשימה
  67.         // סיבוכיות זמן ריצה: O(n)
  68.         public static int HowManyList(List<int> l, int n)
  69.         {
  70.             int count = 0;
  71.             Node<int> pos = l.GetFirst();
  72.             while (pos != null)
  73.             {
  74.                 if (pos.GetInfo() == n)
  75.                     count++;
  76.                 pos = pos.GetNext();
  77.             }
  78.             return count;
  79.         }
  80.         // טענת כניסה: הפעולה מקבלת רשימה של מספרים שלמים ומספר שלם
  81.         // טענת יציאה: הפעולה מוחקת את כל מופעי המספר שהתקבל מהרשימה
  82.         // סיבוכיות זמן ריצה: O(n)
  83.         public static void DebugList(List<int> l, int n)
  84.         {
  85.             Node<int> pos = l.GetFirst();
  86.             while (pos != null)
  87.                 if (pos.GetInfo() == n)
  88.                     pos = l.Remove(pos);
  89.                 else pos = pos.GetNext();
  90.         }
  91.         // טענת כניסה: הפעולה מקבלת רשימה ממוינת של מספרים שלמים ומספר שלם
  92.         // טענת יציאה: הפעולה מכניסה באופן ממוין את המספר לרשימה
  93.         // סיבוכיות זמן ריצה: O(n)
  94.         public static void InsertSorted(List<int> l, int n)
  95.         {
  96.             Node<int> pos = l.GetFirst();
  97.             Node<int> before = null;
  98.             while (pos != null && n > pos.GetInfo())
  99.             {
  100.                 before = pos;
  101.                 pos = pos.GetNext();
  102.             }
  103.             l.Insert(before, n);
  104.         }
  105.         // טענת כניסה: הפעולה מקבלת רשימה של מספרים שלמים
  106.         // טענת יציאה: הפעולה מחזירה "אמת" אם הרשימה ממוינת בסדר עולה, אחרת מחזירה "שקר"
  107.         // סיבוכיות זמן ריצה: O(n)
  108.         public static bool IsSorted(List<int> l)
  109.         {
  110.             Node<int> pos = l.GetFirst();
  111.             while (pos.GetNext() != null)
  112.             {
  113.                 if (pos.GetInfo() > pos.GetNext().GetInfo())
  114.                     return false;
  115.                 pos = pos.GetNext();
  116.             }
  117.             return true;
  118.         }
  119.         // טענת כניסה: הפעולה מקבלת רשימה לא ממוינת של מספרים שלמים
  120.         // טענת יציאה: הפעולה מחזירה רשימה המכילה את כל ערכי הרשימה שהתקבלה בסדר ממוין עולה
  121.         // סיבוכיות זמן ריצה: O(n²)
  122.         public static List<int> Sort(List<int> l)
  123.         {
  124.             List<int> newL = new List<int>();
  125.             Node<int> pos = l.GetFirst();
  126.             while (pos != null)
  127.             {
  128.                 InsertSorted(newL, pos.GetInfo()); //! //O(n)
  129.                 pos = pos.GetNext();
  130.             }
  131.             return newL;
  132.         }
  133.         ///
  134.         /// מחסנית
  135.         ///
  136.         // טענת כניסה: הפעולה מקבלת מחסנית של מספרים שלמים
  137.         // טענת יציאה: הפעולה מחזירה מחסנית חדשה, שאיבריה זהים בערכם ובסדרם לאיברי המחסנית שהתקבלה
  138.         // סיבוכיות זמן ריצה: O(n)
  139.         public static Stack<int> CloneStack(Stack<int> s)
  140.         {
  141.             Stack<int> newS = new Stack<int>();
  142.             Stack<int> tmp = new Stack<int>();
  143.             while (!s.IsEmpty())
  144.                 tmp.Push(s.Pop());
  145.             while (!tmp.IsEmpty())
  146.             {
  147.                 newS.Push(tmp.Top());
  148.                 s.Push(tmp.Pop());
  149.             }
  150.             return newS;
  151.         }
  152.         // טענת כניסה: הפעולה מקבלת מחסנית של מספרים שלמים
  153.         // טענת יציאה: הפעולה מחזירה מחסנית חדשה, שאיבריה מסודרים בסדר הפוך ביחס לאיברי המחסנית שהתקבלה
  154.         // סיבוכיות זמן ריצה: O(n)
  155.         public static Stack<int> FlipStack(Stack<int> s)
  156.         {
  157.             Stack<int> newS = new Stack<int>();
  158.             Stack<int> tmp = CloneStack(s); //!
  159.             while (!tmp.IsEmpty())
  160.                 newS.Push(tmp.Pop());
  161.             return newS;
  162.         }
  163.         // טענת כניסה: הפעולה מקבלת מחסנית של מספרים שלמים ומספר שלם
  164.         // טענת יציאה: המחסנית מחזירה "אמת" אם המספר נמצא במחסנית, אחרת מחזירה "שקר"
  165.         // סיבוכיות זמן ריצה: O(n)
  166.         public static bool IsExistStack(Stack<int> s, int n)
  167.         {
  168.             Stack<int> sCopy = CloneStack(s); //!
  169.             while (!sCopy.IsEmpty())
  170.                 if (sCopy.Pop() == n)
  171.                     return true;
  172.             return false;
  173.         }
  174.         // טענת כניסה: הפעולה מקבלת מחסנית של מספרים שלמים ומספר שלם
  175.         // טענת יציאה: הפעולה מחזירה "אמת" אם המספר נמצא במחסנית, אחרת מחזירה "שקר"
  176.         // הערה: הפעולה רקורסיבית, ועדיין שומרת על סדר המחסנית שהתקבלה
  177.         // סיבוכיות זמן ריצה: O(n)
  178.         public static bool IsExistStackRec(Stack<int> s, int n)
  179.         {
  180.             if (s.IsEmpty())
  181.                 return false;
  182.             int x = s.Pop();
  183.             bool exists = (x == n || IsExistStackRec(s, n));
  184.             s.Push(x); //לאחר הקריאה הרקורסיבית, האיבר שנשלף נדחף בחזרה אל תוך המחסנית
  185.             return exists;
  186.         }
  187.         // טענת כניסה: הפעולה מקבלת מחסנית של מספרים שלמים
  188.         // טענת יציאה: הפעולה מחזירה את סכום איברי המחסנית
  189.         // סיבוכיות זמן ריצה: O(n)
  190.         public static int SumStack(Stack<int> s)
  191.         {
  192.             int sum = 0;
  193.             Stack<int> sCopy = CloneStack(s); //!
  194.             while (!sCopy.IsEmpty())
  195.                 sum += sCopy.Pop();
  196.             return sum;
  197.         }
  198.         // טענת כניסה: הפעולה מקבלת מחסנית של מספרים שלמים
  199.         // טענת יציאה: הפעולה מחזירה את אורך המחסנית - מספר האיברים בה
  200.         // סיבוכיות זמן ריצה: O(n)
  201.         public static int LengthStack(Stack<int> s)
  202.         {
  203.             int length = 0;
  204.             Stack<int> sCopy = CloneStack(s); //!
  205.             while (!sCopy.IsEmpty())
  206.             {
  207.                 length++;
  208.                 sCopy.Pop();
  209.             }
  210.             return length;
  211.         }
  212.         // טענת כניסה: הפעולה מקבלת מחסנית של מספרים שלמים ומספר שלם
  213.         // טענת יציאה: הפעולה מחזירה את מספר הפעמים שהמספר מופיע במחסנית
  214.         // סיבוכיות זמן ריצה: O(n)
  215.         public static int HowManyStack(Stack<int> s, int n)
  216.         {
  217.             int count = 0;
  218.             Stack<int> tmp = CloneStack(s); //!
  219.             while (!tmp.IsEmpty())
  220.                 if (tmp.Pop() == n)
  221.                     count++;
  222.             return count;
  223.         }
  224.         // טענת כניסה: הפעולה מקבלת מחסנית של מספרים שלמים ומספר שלם
  225.         // טענת יציאה: הפעולה מוחקת את כל מופעי המספר שהתקבל מתוך המחסנית
  226.         // סיבוכיות זמן ריצה: O(n)
  227.         public static void DebugStack(Stack<int> s, int n)
  228.         {
  229.             Stack<int> tmp = FlipStack(s); //!
  230.             while (!s.IsEmpty())
  231.                 s.Pop();
  232.             while (!tmp.IsEmpty())
  233.             {
  234.                 int x = tmp.Pop();
  235.                 if (x != n)
  236.                     s.Push(x);
  237.             }
  238.         }
  239.         ///
  240.         /// תור
  241.         ///
  242.         // טענת כניסה: הפעולה מקבלת תור של מספרים שלמים
  243.         // טענת יציאה: הפעולה מחזירה תור חדש, שאיבריו זהים בערכם ובסדרם לאיברי התור שהתקבל
  244.         // סיבוכיות זמן ריצה: O(n)
  245.         public static Queue<int> CloneQueue(Queue<int> q)
  246.         {
  247.             Queue<int> newQ = new Queue<int>();
  248.             Queue<int> tmp = new Queue<int>();
  249.             while (!q.IsEmpty())
  250.             {
  251.                 newQ.Insert(q.Head());
  252.                 tmp.Insert(q.Remove());
  253.             }
  254.             while (!tmp.IsEmpty())
  255.                 q.Insert(tmp.Remove());
  256.             return newQ;
  257.         }
  258.         // טענת כניסה: הפעולה מקבלת מחסנית של מספרים שלמים ומספר שלם
  259.         // טענת יציאה: הפעולה מחזירה "אמת" אם המספר קיים בתור, אחרת מחזירה "שקר"
  260.         // סיבוכיות זמן ריצה: O(n)
  261.         public static bool IsExistQueue(Queue<int> q, int n)
  262.         {
  263.             Queue<int> qCopy = CloneQueue(q); //!
  264.             while (!qCopy.IsEmpty())
  265.                 if (qCopy.Remove() == n)
  266.                     return true;
  267.             return false;
  268.         }
  269.         // טענת כניסה: הפעולה מקבלת תור של מספרים שלמים
  270.         // טענת יציאה: הפעולה מחזירה את סכום איברי התור
  271.         // סיבוכיות זמן ריצה: O(n)
  272.         public static int SumQueue(Queue<int> q)
  273.         {
  274.             int sum = 0;
  275.             Queue<int> qCopy = CloneQueue(q); //!
  276.             while (!qCopy.IsEmpty())
  277.                 sum += qCopy.Remove();
  278.             return sum;
  279.         }
  280.         // טענת כניסה: הפעולה מקבלת תור של מספרים שלמים
  281.         // טענת יציאה: הפעולה מחזירה את אורך התור - מספר האיברים בו
  282.         // סיבוכיות זמן ריצה: O(n)
  283.         public static int LengthQueue(Queue<int> q)
  284.         {
  285.             int length = 0;
  286.             Queue<int> qCopy = CloneQueue(q); //!
  287.             while (!qCopy.IsEmpty())
  288.             {
  289.                 length++;
  290.                 qCopy.Remove();
  291.             }
  292.             return length;
  293.         }
  294.         // טענת כניסה: הפעולה מקבלת תור של מספרים שלמים ומספר שלם
  295.         // טענת יציאה: הפעולה מחזירה את מספר הפעמים שהמספר מופיע בתור
  296.         // סיבוכיות זמן ריצה: O(n)
  297.         public static int HowManyQueue(Queue<int> q, int n)
  298.         {
  299.             int count = 0;
  300.             Queue<int> tmp = CloneQueue(q); //!
  301.             while (!tmp.IsEmpty())
  302.                 if (tmp.Remove() == n)
  303.                     count++;
  304.             return count;
  305.         }
  306.         // טענת כניסה: הפעולה מקבלת תור של מספרים שלמים ומספר שלם
  307.         // טענת יציאה: הפעולה מוחקת את כל מופעי המספר שהתקבל מתוך התור
  308.         // סיבוכיות זמן ריצה: O(n)
  309.         public static void DebugQueue(Queue<int> q, int n)
  310.         {
  311.             Queue<int> tmp = CloneQueue(q); //!
  312.             while (!q.IsEmpty())
  313.                 q.Remove();
  314.             while (!tmp.IsEmpty())
  315.             {
  316.                 int x = tmp.Remove();
  317.                 if (x != n)
  318.                     q.Insert(x);
  319.             }
  320.         }
  321.         ///
  322.         /// עץ בינארי
  323.         ///
  324.         // טענת כניסה: הפעולה מקבלת עץ בינארי של מספרים שלמים
  325.         // טענת יציאה: הפעולה מחזירה עץ חדש, זהה בדיוק בצמתיו ובמיקומים שלהם לעץ שהתקבל
  326.         // סיבוכיות זמן ריצה: O(n)
  327.         public static BinTreeNode<int> CloneTree(BinTreeNode<int> bt)
  328.         {
  329.             if (bt == null)
  330.                 return null;
  331.             BinTreeNode<int> left = CloneTree(bt.GetLeft());
  332.             BinTreeNode<int> right = CloneTree(bt.GetRight());
  333.             return new BinTreeNode<int>(left, bt.GetInfo(), right); //להחליף ימין ושמאל לקבלת עץ מראה
  334.         }
  335.         // טענת כניסה: הפעולה מקבלת עץ בינארי של מספרים שלמים ומספר שלם
  336.         // טענת יציאה: הפעולה מחזירה "אמת" אם המספר שהתקבל נמצא בעץ, אחרת מחזירה "שקר"
  337.         // סיבוכיות זמן ריצה: O(n)
  338.         public static bool IsExistTree(BinTreeNode<int> bt, int n)
  339.         {
  340.             if (bt == null)
  341.                 return false;
  342.             return (bt.GetInfo() == n || IsExistTree(bt.GetLeft(), n) || IsExistTree(bt.GetRight(), n));
  343.         }
  344.         // טענת כניסה: הפעולה מקבלת עץ בינארי של מספרים שלמים
  345.         // טענת יציאה: הפעולה מחזירה את סכום ערכי כל הצמתים בעץ
  346.         // סיבוכיות זמן ריצה: O(n)
  347.         public static int SumTree(BinTreeNode<int> bt)
  348.         {
  349.             if (bt == null)
  350.                 return 0;
  351.             return bt.GetInfo() + SumTree(bt.GetLeft()) + SumTree(bt.GetRight());
  352.         }
  353.         // טענת כניסה: הפעולה מקבלת עץ בינארי של מספרים שלמים
  354.         // טענת יציאה: הפעולה מחזירה "אמת" אם העץ הוא עלה, אחרת מחזירה "שקר"
  355.         // סיבוכיות זמן ריצה: O(1)
  356.         public static bool IsLeaf(BinTreeNode<int> bt)
  357.         {
  358.             return (bt.GetLeft() == null && bt.GetRight() == null);
  359.         }
  360.         // טענת כניסה: הפעולה מקבלת עץ בינארי של מספרים שלמים
  361.         // טענת יציאה: הפעולה מדפיסה את ערכי הצמתים בעץ לפי סדר תחילי - שורש, שמאל, ימין
  362.         // סיבוכיות זמן ריצה: O(n)
  363.         public static void PrintPreOrder(BinTreeNode<int> bt)
  364.         {
  365.             if (bt != null)
  366.             {
  367.                 Console.WriteLine(bt.GetInfo());
  368.                 PrintPreOrder(bt.GetLeft());
  369.                 PrintPreOrder(bt.GetRight());
  370.             }
  371.         }
  372.         // טענת כניסה: הפעולה מקבלת עץ בינארי של מספרים שלמים
  373.         // טענת יציאה: הפעולה מדפיסה את ערכי הצמתים בעץ לפי סדר תוכי - שמאל, שורש, ימין
  374.         // סיבוכיות זמן ריצה: O(n)
  375.         public static void PrintInOrder(BinTreeNode<int> bt)
  376.         {
  377.             if (bt != null)
  378.             {
  379.                 PrintInOrder(bt.GetLeft());
  380.                 Console.WriteLine(bt.GetInfo());
  381.                 PrintInOrder(bt.GetRight());
  382.             }
  383.         }
  384.         // טענת כניסה: הפעולה מקבלת עץ בינארי של מספרים שלמים
  385.         // טענת יציאה: הפעולה מדפיסה את ערכי הצמתים בעץ לפי סדר סופי - שמאל, ימין, שורש
  386.         // סיבוכיות זמן ריצה: O(n)
  387.         public static void PrintPostOrder(BinTreeNode<int> bt)
  388.         {
  389.             if (bt != null)
  390.             {
  391.                 PrintPostOrder(bt.GetLeft());
  392.                 PrintPostOrder(bt.GetRight());
  393.                 Console.WriteLine(bt.GetInfo());
  394.             }
  395.         }
  396.         // טענת כניסה: הפעולה מקבלת עץ בינארי של מספרים שלמים
  397.         // טענת יציאה: הפעולה מדפיסה את ערכי הצמתים בעץ לפי הרמה שלהם - כל צמתי העץ ברמה כלשהי יודפסו אחד אחרי השני
  398.         // סיבוכיות זמן ריצה: O(n)
  399.         public static void PrintByLevels(BinTreeNode<int> bt)
  400.         {
  401.             Queue<BinTreeNode<int>> q = new Queue<BinTreeNode<int>>();
  402.             q.Insert(bt);
  403.             while (!q.IsEmpty())
  404.             {
  405.                 BinTreeNode<int> current = q.Remove();
  406.                 Console.WriteLine(current.GetInfo());
  407.                 if (current.GetLeft() != null)
  408.                     q.Insert(current.GetLeft());
  409.                 if (current.GetRight() != null)
  410.                     q.Insert(current.GetRight());
  411.             }
  412.         }
  413.         // טענת כניסה: הפעולה מקבלת עץ בינארי של מספרים שלמים
  414.         // טענת יציאה: הפעולה מחזירה את מספר הצמתים בעץ
  415.         // סיבוכיות זמן ריצה: O(n)
  416.         public static int CountNodes(BinTreeNode<int> bt)
  417.         {
  418.             if (bt == null)
  419.                 return 0;
  420.             return 1 + CountNodes(bt.GetLeft()) + CountNodes(bt.GetRight());
  421.         }
  422.         // טענת כניסה: הפעולה מקבלת עץ בינארי של מספרים שלמים
  423.         // טענת יציאה: הפעולה מחזירה את מספר העלים בעץ
  424.         // סיבוכיות זמן ריצה: O(n)
  425.         public static int CountLeaves(BinTreeNode<int> bt)
  426.         {
  427.             if (bt == null)
  428.                 return 0;
  429.             if (IsLeaf(bt)) //!
  430.                 return 1;
  431.             return CountLeaves(bt.GetLeft()) + CountLeaves(bt.GetRight());
  432.         }
  433.         // טענת כניסה: הפעולה מקבלת עץ בינארי של מספרים שלמים
  434.         // טענת יציאה: הפעולה מחזירה את גובה העץ
  435.         // סיבוכיות זמן ריצה: O(n)
  436.         public static int Height(BinTreeNode<int> bt)
  437.         {
  438.             if (bt == null)
  439.                 return -1;
  440.             return 1 + Math.Max(Height(bt.GetLeft()), Height(bt.GetRight()));
  441.         }
  442.         // טענת כניסה: הפעולה מקבלת עץ בינארי של מספרים שלמים
  443.         // טענת יציאה: הפעולה מחזירה את הערך הגבוה ביותר בעץ
  444.         // סיבוכיות זמן ריצה: O(n)
  445.         public static int MaxValue(BinTreeNode<int> bt)
  446.         {
  447.             if (IsLeaf(bt)) //!
  448.                 return bt.GetInfo();
  449.             int maxLeft = MaxValue(bt.GetLeft());
  450.             int maxRight = MaxValue(bt.GetRight());
  451.             return Math.Max(bt.GetInfo(), Math.Max(maxLeft, maxRight));
  452.         }
  453.         // טענת כניסה: הפעולה מקבלת עץ בינארי "בן" ואת הצומת העליון ביותר בעץ כלשהו בו נמצא "בן" - "שורש"
  454.         // טענת יציאה: הפעולה מחזירה את האב של העץ "בן". אם אביו לא נמצא בעץ "שורש" - יוחזר ערך ריק
  455.         // סיבוכיות זמן ריצה: O(n)
  456.         public static BinTreeNode<int> GetFather(BinTreeNode<int> source, BinTreeNode<int> son)
  457.         {
  458.             if (source == null)
  459.                 return null;
  460.             if (source.GetLeft() == son || source.GetRight() == son)
  461.                 return source;
  462.             BinTreeNode<int> left = GetFather(source.GetLeft(), son);
  463.             if (left != null)
  464.                 return left;
  465.             return GetFather(source.GetRight(), son);
  466.         }
  467.         // טענת כניסה: הפעולה מקבלת עץ בינארי של מספרים שלמים ומספר שלם
  468.         // טענת יציאה: הפעולה מחזירה את מספר הצמתים בהם מופיע הערך שהתקבל
  469.         // סיבוכיות זמן ריצה: O(n)
  470.         public static int HowManyTree(BinTreeNode<int> bt, int n)
  471.         {
  472.             if (bt == null)
  473.                 return 0;
  474.             if (bt.GetInfo() == n)
  475.                 return 1 + HowManyTree(bt.GetLeft(), n) + HowManyTree(bt.GetRight(), n);
  476.             return HowManyTree(bt.GetLeft(), n) + HowManyTree(bt.GetRight(), n);
  477.         }
  478.         // טענת כניסה: הפעולה מקבלת עץ בינארי של מספרים שלמים ומספר שלם המייצג רמה בעץ
  479.         // טענת יציאה: הפעולה מחזירה את מספר הצמתים ברמה שהתקבלה
  480.         // סיבוכיות זמן ריצה: O(n)
  481.         public static int NodesInLevel(BinTreeNode<int> bt, int level)
  482.         {
  483.             if (bt == null)
  484.                 return 0;
  485.             if (level == 0)
  486.                 return 1;
  487.             return NodesInLevel(bt.GetLeft(), level - 1) + NodesInLevel(bt.GetRight(), level - 1);
  488.         }
  489.         // טענת כניסה: הפעולה מקבלת עץ בינארי של מספרים שלמים
  490.         // טענת יציאה: הפעולה מחזירה "אמת" אם העץ הוא עץ חיפוש בינארי, אחרת מחזירה "שקר"
  491.         // סיבוכיות זמן ריצה: O(n)
  492.         public static bool IsBST(BinTreeNode<int> bt)
  493.         {
  494.             if (bt == null)
  495.                 return true;
  496.             if (bt.GetLeft() != null && bt.GetLeft().GetInfo() >= bt.GetInfo())
  497.                 return false;
  498.             if (bt.GetRight() != null && bt.GetRight().GetInfo() < bt.GetInfo())
  499.                 return false;
  500.             return IsBST(bt.GetLeft()) && IsBST(bt.GetRight());
  501.         }
  502.         // טענת כניסה: הפעולה מקבלת עץ בינארי של מספרים שלמים ומספר שלם
  503.         // טענת יציאה: הפעולה מוסיפה את המספר שהתקבל לעץ החיפוש הבינארי
  504.         // סיבוכיות זמן ריצה: O(log(n))
  505.         public static void AddToBST(BinTreeNode<int> bt, int n)
  506.         {
  507.             if (bt.GetLeft() == null && n < bt.GetInfo())
  508.                 bt.SetLeft(new BinTreeNode<int>(n));
  509.             else if (bt.GetRight() == null && n >= bt.GetInfo())
  510.                 bt.SetRight(new BinTreeNode<int>(n));
  511.             else if (n < bt.GetInfo())
  512.                 AddToBST(bt.GetLeft(), n);
  513.             else AddToBST(bt.GetRight(), n);
  514.         }
  515.     }
  516. }
Advertisement
Add Comment
Please, Sign In to add comment