节点代码或算法的通用树父

时间:2013-12-05 19:56:53

标签: c++ c algorithm generics tree

我有一个分配要求我从txt读取一个通用树,在内存中分配树然后执行一系列操作,如删除节点,删除子树,列出节点的子节点,列出节点的后代,以及我遇到问题的节点,列出节点的父节点。使用的语言是C.可能有C ++语言的元素不是“快捷方式”,例如使用类。

我将此结构用于通用树:

typedef struct genTree
    {
        char info;
        struct genTree* first; //points to the first child of a node
        struct genTree* next; //points to the first sibling of a node
    }tgt;
    typedef tgt* pgt;

这意味着节点的父亲指向它的第一个孩子,然后这个孩子指向它的兄弟姐妹。

我想出了这个总是返回树根的函数:

pgt find_father(pgt root, char SON_PARAM)    
{    
        pgt son, father;
        if(root == NULL) return NULL;
        if(root->info == SON_NODE) return root;
        if(root->next != NULL) {
             son = find_father(root->next, SON_NODE);
             return son;
        }
        else {
             father = root;
             son = find_father(root->first, SON_NODE);
             if(son == NULL) return NULL;
             else return son;
        }
}

感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

您的函数在所有情况下都没有return语句。您应该返回struct genTree *类型的内容。此外,当您设置b->first = find_father(root->next, NODE_PARAM)时,您实际上会覆盖整个树。请注意,b不是struct genTree,而是struct genTree *。这意味着您要将first 中的字段b重置为。最后,您必须在此处进行深度优先搜索,因为您没有反向引用。最简单的方法是在struct genTree中引入反向引用。假设我理解你正在尝试做什么,试试这个:

struct genTree
{
    char info;
    struct genTree* parent; //points to the parent of a node (NULL if root)
    struct genTree* first; //points to the first child of a node
    struct genTree* next; //points to the first sibling of a node
}

struct genTree* find_father(struct genTree* root, char NODE_PARAM)    
{    
        struct genTree* b;
        if(root == NULL) return NULL;  //standard error checking    
        if(root->info == NODE_PARAM) return root->parent;    
        b = find_father(root->first, NODE_PARAM);
        if(b == NULL)     
        {    
            b = find_father(root->next, NODE_PARAM);
        }
        return b;
}

在这种情况下,退出代码为1可能是由于处理器正在尝试读取垃圾回收值这一事实。如果它是一个数字就可以了,但垃圾指针(即使它只是NULL)通常是个问题。