Итеративное копирование бинарного дерева

Мне задали этот вопрос в интервью, и это буквально стоило мне работы: п Интервьюер спросил, что вам дадут корень дерева, и вы должны вернуть корень скопированному дереву, но копия должна быть сделана итеративно. Я вставляю свой код здесь, я написал то же самое там, и он отлично работает. Сначала я сделал это, используя два стека, которые, по словам интервьюера, ему не понравились, затем я сделал это следующим образом. Интервьюер был немного недоволен тем, что я использовал другую структуру, которая содержит указатель на исходное и окончательное дерево (см. код).

Мне интересно, есть ли другой, лучший способ сделать это??

struct node
{
   int data;
   struct node * left;
   struct node * right;
};

struct copynode
{
   node * original;
   node * final;
};

node * copy(node *root)
{
    stack <copynode*> s;
    copynode * temp=(copynode*)malloc(sizeof(copynode));
    temp->original=root;
    temp->final=(node *)malloc(sizeof(node));
    s.push(temp);
    while(s.empty()==false)
    {
       copynode * i;
       i=s.top();
       s.pop();
       i->final=i->original;
       if(i->original->left)
       {
          copynode *left=(copynode*)malloc(sizeof(copynode));
          left->original=i->original->left;
          left->final=(node *)malloc(sizeof(node));
          s.push(left);
       }
       if(i->original->right)
       {
          copynode *right=(copynode*)malloc(sizeof(copynode));
          right->original=i->original->right;
          right->final=(node *)malloc(sizeof(node));
          s.push(right);
       }
   }  
   return temp->final;
}
12
задан plasmacel 2 October 2018 в 13:19
поделиться