我有一个二进制树,其节点颜色为绿色,白色或红色。如果找到形成意大利旗的三个节点的路径,则该函数返回1,否则返回0。
这是我尝试过的,但它给了我分段错误。
struct node{
char color;
struct node* left;
struct node* right;
struct node* father;
};
typedef struct node* Node;
int flag(Node v){
if(v==NULL)
return 0;
flag(v->left);
flag(v->right);
if(v->color=='W' && v->father->color=='G' && (v->left->color=='R' || v->right->color=='R'))
return 1;
}
编辑:感谢大家的回答。这应该是正确的版本
int flag(Node v){
if(v==NULL)
return 0;
if(v->left && v->father)
if(v->color=='B' && v->father->color=='V' && v->left->color=='R')
return 1;
if(v->right&& v->father)
if(v->color=='B' && v->father->color=='V' && v->right->color=='R')
return 1;
return flag(v->left) || flag(v->right);
}
答案 0 :(得分:1)
问题可能是您使用无效指针flag
或v->left
来调用v->right
。
可能你没有用NULL初始化节点字段。
其他问题是,如果v->left
或v->right
中的任何一个为NULL,您仍会尝试在上次撰写的条件中访问v->left->color
。
其他错误是,如果最后一个组合为false,则不显式返回值。如果
v->color=='W' &&
v->father->color=='G' &&
(v->left->color=='R' || v->right->color=='R')
为false,您不会在函数末尾返回值。
答案 1 :(得分:0)
你可能有NULL指针......
if(v->color=='W' && v->father->color=='G' && (v->left->color=='R' || v->right->color=='R'))
在取消引用它们之前,不检查v->left
或v->right
是否为NULL。对于根节点,v->father
也可以为NULL。
您还应该添加一个返回0的其他部分。
除此之外:
出于哪个目的,如果您不关心返回值,请致电flag(v->left)
和flag(v->right)
?
答案 2 :(得分:0)
int flag(Node v)
{
if(v==NULL)
return 0;
flag(v->left); // <<-- this call will return when v->left is NULL
flag(v->right); // <<-- this call will return when v->right is NULL
//so, if you come till here in case 'v' is leaf then (v->left is NULL) and (v->right is NULL)
//but you are accessing them as 'v->left->color' and 'v->right->color'
//that is accessing 'NULL->color' is bound to break.
if(v->color=='W' && v->father->color=='G' && (v->left->color=='R' || v->right->color=='R'))
return 1;
}