无法理解此代码中的最后一步

时间:2014-12-08 08:53:49

标签: c++

从inorder和预订

构建树的功能
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 个答案:

答案 0 :(得分:0)

按顺序为[Lin]N[Rin],预订为N[Lpr][Rpr]

此函数从Preorder中选择第一个节点N,并在N之后从Inorder列表(借助预订)和右子孙从Inorder列表(借助预订)构建左子子。

此代码通过以下终止条件递归来实现此目的

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;步骤的信息,然后计算左子树中的节点数。所以当你再次调用函数时:

  

q-&gt;接下来指向[Rin]
preptr指向[Rpr]
  num-i-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