从森林中构建n元树

时间:2019-01-04 04:21:21

标签: c++ c c++11

我请教授给我另一个学期的老作业。关于建立家谱,然后找到给定的两个节点之间的亲属关系。家谱是关于namekians(龙珠z)的,因此每个namekian都有一个父亲。

问题是输入内容如下:

First name is the parent  Second name is the child
Iolin                     Lyre
Iolin                     Piyano
Batu                      Iolin
Batu                      Okiat
Ollusc                    Xylo
Organa                    Murd
Piccoro                   Ollusc
Piccoro                   Rombone
Rombone                   Organa

所以我必须有两棵树,一棵以Piccoro作为领导者(他始终是一棵树的领导者),而另一棵则具有未知的领导者。

问题是,当我尝试创建树时遇到麻烦,我知道我有两个根,但是如您所见,输入顺序不正确,因此生病的节点没有父级,直到我读取并创建其父级。例如,我创建了Ollusc及其子Xylo,然后创建Organa和Murd,但是我只有一个根来表示该树(而且我不知道它们是否在同一棵树中),所以我不知道如何“保存” “那些节点以后再将它们连接起来,Organa和Rombone也会发生同样的情况,直到我创建Rombone,然后将他与Organa连接起来,Organa才会出现。

   Batu------>NULL
   /     \
 Iolin--->Okiat->NULL
  /   \
Lyre-->Piyano->NULL

   Piccoro-----> NULL
   /       \
 Ollusc--->Rombone->NULL
 /          /
Xylo->NULL Organa->NULL
           /
          Murd->NULL

我考虑将节点保存到队列或堆栈中,因为在连接它们之前我不知道有多少节点会漂浮在某个地方,但是将它们保存到队列中又是什么呢,因为当我考虑下一步时我不知道该怎么办。 也许将一个节点存储到队列中,直到出现“父节点”节点,然后从队列中取出该节点,但将其FIFO排队,并没有太大帮助,因为如果我需要使用第二个节点或第三个节点而不是前一个。 那么也许将它们存储在辅助列表中? 如果他们没有父节点并且不是根节点,我应该将节点添加到列表,队列,堆栈中?还是应该将根添加到列表,队列,堆栈? 因为我使用根来构建树 在第一棵树上,我的根是伊奥林,直到黑风出现,然后我将其更改为黑风 在第二棵树中,根永远是Piccoro,但是要建立一个以piccoro开头的树有点困难,因为我不知道他的孩子们

您怎么看?我该怎么办?您有更好的主意吗?

int main(int argc, char const *argv[])
{
    FILE *fpInput,*fpOutput;

    fpInput = fopen("input.in","r");
    fpOutput = fopen("output.out","w");

    if ((fpInput == NULL)){ printf("Open File Error\n"); exit(1); }

        // To read a line of the file
        char *fpInputString;
        char *parentInput, *childInput;

        // Because i dont know the number of lines that comes next, read until a number is found
        // That number is the number of consult of kinship about namekians

        fpInputString = inputString(fpInput,5);
        while ((strlen(fpInputString) != 1) && (strlen(fpInputString) != 2) && (strlen(fpInputString) != 3))
        {           

            parentInput = strtok(fpInputString," ");
            childInput  = strtok(NULL,"\0");

            fpInputString = inputString(fpInput,5);
        }


    fclose(fpInput);
    fclose(fpOutput);
    return 0;
}

InputString函数从文件中读取整行

tree.h

// Struct of a node
struct treeNode
{
    // Name
    char *name;

    // Pointers
    struct treeNode *parent;
    struct treeNode *firstChild;
    struct treeNode *nextSibling;
    struct treeNode *prevSibling;
};

如果您能帮助我,我将非常感激,我知道很难理解我或我的代码

但是我真的很想学习有关编码的新知识,我不知道如果我用c ++来做这门功课会更好,因为c没有STL

1 个答案:

答案 0 :(得分:0)

使用地图保存输入信息。

找到祖先节点。

将子节点添加到祖先节点。

如果节点不是祖先节点,则不要为其构建树。