在二叉树中形成具有3个节点的标志

时间:2017-01-04 10:22:55

标签: c binary-tree

我有一个二进制树,其节点颜色为绿色,白色或红色。如果找到形成意大利旗的三个节点的路径,则该函数返回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);


  }

3 个答案:

答案 0 :(得分:1)

问题可能是您使用无效指针flagv->left来调用v->right

可能你没有用NULL初始化节点字段。

其他问题是,如果v->leftv->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->leftv->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;
}