Advertisement
Proff_Ust

tree_count_rec

Dec 22nd, 2019
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.96 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.             int counter = 1 + Task(t->left)+Task(t->right);//считаем кол-во потомков
  43.             t->value = counter - 1;//и кладем его в значение узла дерева. -1 потому что сам узел
  44.                                    //учитывать не надо
  45.             return counter;//и возвращаем кол-во
  46.         }
  47.         else
  48.         {
  49.             t->value = 0;//потомков нет, присваваем сюда 0
  50.             return 1;//но этот узел является чьим то потомком, пожтому его надо учесть и вернуть здесь 1
  51.         }
  52.     else
  53.         return 0;//если дерево пусто, просто возвращаем 0
  54. }
  55.  
  56. void printTree(TTree *bt, int spaces)
  57. {
  58.   if(bt != NULL)
  59.   {
  60.     printTree(bt->right, spaces + 5);
  61.     for(int i = 0; i < spaces; i++)
  62.         cout << ' ';
  63.         cout << "   " << bt->value << endl;
  64.     printTree(bt->left, spaces + 5);
  65.   }
  66. }
  67.  
  68. int main()
  69. {
  70.     setlocale(0,"Russian");
  71.     TTree* treeOne = NULL;
  72.     int t;
  73.     for(int j=1;j<=7;j+=2)
  74.         addToTree(&treeOne, j);
  75.     for(int i=2;i<=8;i+=2)
  76.         addToTree(&treeOne, i);
  77.     printTree(treeOne,1);
  78.     cout<<endl;
  79.     Task(treeOne);
  80.     printTree(treeOne,1);
  81.     return 0;
  82. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement