从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);
答案 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