我正在处理一棵三元树。它有点独特,因为每个叶子都包含一个指向链表的指针,链表保持一个大小(代表节点数)。
以下是我的代码中的结构,可以为您提供一些想法。
#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.有人可以指出为什么以及如何解决这个问题?
答案 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);}
}