Поиск в бинарном дереве через рекурсию - C#

Узнай цену своей работы

Формулировка задачи:

Здравствуйте! Подскажите пожалуйста... Мне нужно организовать поиск в бинарном дереве через рекурсию. Добавление то работает(вроде бы) нормально, а вот поиск почему то зацикливается... В общем-логика примерно следующая: Если текущий элемент не равен Null, тогда мы сравниваем его Value(значение) с тем, что мы ищем через CompareTo(в бинарном дереве требуется хранить классы, реализующие интерфейс IComparable). Если результат равен 0(т.е. обе записи одинаковые по сравниваемым критериям)-то мы вернём ветвь с этим элементов. В противном же случае-мы вызываем этот же метод из других ветвей в зависимости от результата CompareTo. Вот весь код программы:
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. namespace ConsoleApplication2
  7. {
  8. class Program
  9. {
  10. class Tree<TYPE> where TYPE : IComparable
  11. {
  12. private TYPE Value;
  13. private Tree<TYPE> Up;
  14. private Tree<TYPE> Left;
  15. private Tree<TYPE> Right;
  16. public TYPE GetValue
  17. {
  18. get
  19. {
  20. return this.Value;
  21. }
  22. }
  23. public void Insert(TYPE Value)
  24. {
  25. if (this.Value == null) this.Value = Value;
  26. else
  27. {
  28. if (this.Value.CompareTo(Value) < 0)
  29. {
  30. if (this.Right == null) this.Right = new Tree<TYPE>(Value);
  31. else this.Right.Insert(Value);
  32. }
  33. else if (this.Value.CompareTo(Value) > 0)
  34. {
  35. if (this.Left == null) this.Left = new Tree<TYPE>(Value);
  36. else this.Left.Insert(Value);
  37. }
  38. else if (this.Value.CompareTo(Value) == 0) Console.WriteLine("Невозможно добавить одинаковый элемент");
  39. }
  40. }
  41. public Tree<TYPE> Search(TYPE Value)
  42. {
  43. if (this != null)
  44. {
  45. if (this.Value.CompareTo(Value) == 0) return this;
  46. else if (this.Value.CompareTo(Value) > 0) this.Left.Search(Value);
  47. else if (this.Value.CompareTo(Value) < 0) this.Right.Search(Value);
  48. }
  49. return null;
  50. }
  51. public Tree()
  52. {
  53. this.Up = null;
  54. this.Left = null;
  55. this.Right = null;
  56. }
  57. public Tree(TYPE Value)
  58. {
  59. this.Up = null;
  60. this.Left = null;
  61. this.Right = null;
  62. this.Value = Value;
  63. }
  64. }
  65. class MyClass : IComparable
  66. {
  67. private Int32 Value = new Int32();
  68. public Int32 CompareTo(object Data)
  69. {
  70. if (this.Value == (Data as MyClass).Value) return 0;
  71. else if (this.Value > (Data as MyClass).Value) return 1;
  72. else return -1;
  73. }
  74. public MyClass()
  75. {
  76. this.Value = new Int32();
  77. }
  78. public MyClass(Int32 Value)
  79. {
  80. this.Value = Value;
  81. }
  82. }
  83. static void Main(string[] args)
  84. {
  85. Tree<MyClass> Data = new Tree<MyClass>(new MyClass(50));
  86. Data.Insert(new MyClass(45));
  87. Data.Insert(new MyClass(59));
  88. Data.Insert(new MyClass(15));
  89. Data.Insert(new MyClass(53));
  90. Data.Insert(new MyClass(83));
  91. Data.Insert(new MyClass(33));
  92. Data.Insert(new MyClass(22));
  93. Data.Insert(new MyClass(1));
  94. Console.WriteLine(Data.Search(new MyClass(53)).GetValue.ToString());//Вот здесь и происходит "зацикливание"...
  95. Console.ReadKey();
  96. }
  97. }
  98. }
Ошибка происходит конкретно в этом методе:
Листинг программы
  1. public Tree<TYPE> Search(TYPE Value)
  2. {
  3. if (this != null)
  4. {
  5. if (this.Value.CompareTo(Value) == 0) return this;
  6. else if (this.Value.CompareTo(Value) > 0) this.Left.Search(Value);
  7. else if (this.Value.CompareTo(Value) < 0) this.Right.Search(Value);
  8. }
  9. return null;//Если this == null-тогда и вернётся null. Если элемент не был найден-то и вернём пустую ссылку.
  10. }

Решение задачи: «Поиск в бинарном дереве через рекурсию»

textual
Листинг программы
  1. public Tree<TYPE> Search(TYPE Value)
  2.             {
  3. int res=this.Value.CompareTo(Value);
  4. if(res == 0) return this;
  5. if(res>0)
  6. (
  7.   if(this.Left!=null)
  8.      return this.Left.Search(Value);
  9. }
  10. else
  11. {
  12.   if(this.Right!=null)
  13.     return this.Right.Search(Value);
  14. }
  15. return null;
  16. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 4.1 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы