用于检查叶子内的链表大小的递归函数

时间:2014-11-30 23:13:14

标签: c tree

我正在处理一棵三元树。它有点独特,因为每个叶子都包含一个指向链表的指针,链表保持一个大小(代表节点数)。

以下是我的代码中的结构,可以为您提供一些想法。

#ifndef VARIABLES_H_
#define VARIABLES_H_

struct data
{
  int val;
};




struct node
{
  struct node* next;
  struct data* dta;
};

struct linkedList
{
  int size;
  struct node *head;
};

struct leaf
{
  struct linkedList* ll;
  struct leaf* left;
  struct leaf* right;
  struct leaf* center;
  struct leaf* parent;
};

struct tree
{
  struct leaf* root;
};


#endif

我正在尝试编写一个函数,如果树中的所有叶子都有一个大小为3的链表,否则返回1。

这是我到目前为止所做的。

int isFullList(struct tree *tr)
{
  if(tr->root == NULL)
  {
    return 0;
  }
  else
  {
    return isFullList_r(tr->root);
  }
}

int isFullList_r(struct leaf *lf)
{
  if(lf==NULL){return 1;}
  if(lf->ll->size == 3){return 1;}
  if(lf->ll->size != 3){return 0;}   

  return isFullList_r(lf->left) && isFullList_r(lf->center) && isFullList_r(lf->right);
}

然而,我没有得到正确的答案,因为它总是不断返回1.有人可以指出为什么以及如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

函数isFullList_r

中的某些内容听起来不正确
int isFullList_r(struct leaf *lf)
{
  if(lf==NULL){return 1;}

  // if>ll->size is 3, you return here.
  if(lf->ll->size == 3){return 1;}

  // if>ll->size is not 3, you return here. 
  if(lf->ll->size != 3){return 0;}   

  // The code never gets here.
  return isFullList_r(lf->left) && isFullList_r(lf->center) && isFullList_r(lf->right);
}

您的语句我正在尝试编写一个函数,如果树中的所有叶子都有一个大小为3的链表,否则返回1。听起来不合逻辑。一些leaf必须少于3个项目。这就是树的结束方式。

答案 1 :(得分:1)

递归函数需要处理实际的叶子(树的端点),以及检查每个节点的链表长度。

int isFullList_r(struct leaf *lf)
{

  // End condition for passing in NULL leafs
  if(lf == NULL){ return 1;}

  if(lf->ll==NULL){return 0;} // Not size 3
  if(lf->ll->size != 3){return 0;}  //Not size 3 

  if(lf->ll->size == 3){return 
      isFullList_r(lf->left) && isFullList_r(lf->center) && isFullList_r(lf->right);}
}