Advertisement
Proff_Ust

tree_sum_rec

Nov 2nd, 2019
153
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.76 KB | None | 0 0
  1. #include <iostream>
  2. /*
  3. Рекурсивный алгоритм
  4. По данному дереву постросить новое, значение в каждом узле которого равно сумме значений потомков
  5. */
  6. using namespace std;
  7. struct TTree
  8. {
  9.     int value;
  10.     TTree* left;
  11.     TTree* right;
  12. };
  13.  
  14. bool isEmpty(TTree* t)
  15. {
  16.     return (t==NULL);
  17. }
  18.  
  19. void addToTree(TTree** t, int newValue)
  20. {
  21.     if(isEmpty((*t)))//если переданное поддерево пусто, то
  22.     {
  23.         TTree* temp = new TTree;//создаем новый элемент
  24.         temp->value = newValue;//кладем переданное значение в него
  25.         temp->left = NULL;
  26.         temp->right = NULL;
  27.         (*t) = temp;//и переприсваиваем новый узел переданноу поддереву
  28.     }
  29.     else//если непусто
  30.         if(newValue<(*t)->value)                   //
  31.             addToTree(&(*t)->left,newValue);       //
  32.         else                                       //ищем куда его положить перемещаясь направо или налево
  33.             if(newValue>(*t)->value)               //в зависимости от добавляемого значения
  34.                 addToTree(&(*t)->right,newValue);  //
  35. }
  36.  
  37. int Task(TTree* t)//функция для суммирования в узел значений потомков
  38. {
  39.     if(t!=NULL)//если поддеревео не пусто
  40.         if((t->left!=NULL)||(t->right!=NULL))//если у поддерева есть потомки
  41.         {
  42.             t->value = t->value+Task(t->left)+Task(t->right);//прибавляем в значение сумму значений потомков
  43.             return t->value;//и возвращаем что у нас насуммуровалось
  44.         }
  45.         else
  46.             return t->value;//если узла нет потомков, складываеть ничего не надо, просто возвращаем значение этого узла
  47.     else
  48.         return 0;//если деррево пусто, просто возвращаем 0
  49. }
  50.  
  51. void printTree(TTree *bt, int spaces)
  52. {
  53.   if(bt != NULL)
  54.   {
  55.     printTree(bt->right, spaces + 5);
  56.     for(int i = 0; i < spaces; i++)
  57.         cout << ' ';
  58.         cout << "   " << bt->value << endl;
  59.     printTree(bt->left, spaces + 5);
  60.   }
  61. }
  62.  
  63. int main()
  64. {
  65.     setlocale(0,"Russian");
  66.     TTree* treeOne = NULL;
  67.     int t;
  68.     for(int j=1;j<=3;j++)
  69.         addToTree(&treeOne, j);
  70.     for(int i=6;i>=4;i--)
  71.         addToTree(&treeOne, i);
  72.     printTree(treeOne,1);
  73.     cout<<endl;
  74.     Task(treeOne);
  75.     printTree(treeOne,1);
  76.     return 0;
  77. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement