2014-12-08 3 views
0

функция для построения дерева из симметричного и PREORDERне в состоянии понять последний шаг в этом коде

struct treenode * construct(struct listnode *inptr,struct listnode * preptr ,int num) 
{  
    struct treenode *temp; 
    struct listnode *q; 
    int i,j; 
    if(num==0) 
    return NULL; 
    temp=(struct treenode *)malloc(sizeof(struct treenode)); 
    temp->info=preptr->info; 
    temp->left=NULL; 
    temp->right=NULL; 
    if(num==1)/*if only one node in tree*/ 
    return temp; 
    q=inptr; 
    for(i=q;q->info!=preptr->info;i++) q=q->next; 
    /*now q points to root node in inorder list and the number of nodes in its left tree is i*/ 
    /*for left subtree*/ 
    temp->lchild=construct(inptr,preptr->next,i); 
    /*for right subtree*/ 
    for(j=1;j<=i+1;j++) preptr=preptr->next; 
    temp->rchild=construct(q->next,preptr,num-i-1);//unbale to understand this step as after node G construction value of i and num would be same this would result in -1 
    return temp; 
}/*end of construct */ 

Вопрос: Я не могу понять, что мы хотим достичь с помощью temp->rchild=construct(q->next,preptr,num-i-1);

+1

Что именно вы не понимаете? Синтаксис? Логика? Пожалуйста, будьте более конкретными. – Maroun

+1

Он вызывает эту функцию рекурсивно. –

+0

Логика @MarounMaroun не понятна, поскольку после ручной отладки я обнаружил, что значение i и num будет одинаковым на каком-то этапе, и там не будет базового случая для завершения. Я нашел этот код в книге структуры данных. – yogeshmanjhi

ответ

0

Inorder is [Lin]N[Rin] и Preorder - N[Lpr][Rpr].

Этой функция выбирает первый узел N от предпорядка и построить левый subchild из списка заказовМои (с помощью предварительного заказа) и правой subchild из списка заказовМои (с помощью предварительного заказа) после того, как N.

Этого код достигает этого рекурсией с последующим завершающего состояния

if(num==1)/*if only one node in tree*/ 
    return temp; 

О шаге вы не понимаете
for(j=1;j<=i+1;j++) preptr=preptr->next; продвинется preptr за N и [Lpr] и в следующем шаге используется для построения правильного суб-тр й. Он использует информацию с шага for(i=q;q->info!=preptr->info;i++) q=q->next;, перед которым подсчитывается количество узлов в левом поддереве. Поэтому при вызове функции revursively:

q-> Следующий указатель указывает на [Rin]
preptr указывает на [Rpr]
Num-я-1 является число узлов в правом поддереве

в качестве примечания
for(i=q;q->info!=preptr->info;i++) q=q->next; должен быть for(i=0;q->info!=preptr->info;i++) q=q->next;. Уведомление q заменено на 0

+0

не могли бы вы дать мне код, чтобы проверить вышеприведенную функцию, чтобы я мог проверить ее отладку. – yogeshmanjhi

+0

@ mohit спасибо большое, я понял это сейчас! – yogeshmanjhi

+0

Я рад, что это помогло вам :) –