如何在给定水平顺序遍历的情况下构造树?

时间:2014-12-29 19:08:12

标签: c algorithm tree tree-traversal

我在这个问题上看过类似的question,但我不需要建立BST。

从给定的输入中,例如:2 0 3 0 1 0 3,它将构建: input to tree

说明:

2 -> the root has 2 children
0 -> the left child of the root has no children
3 -> the rigth child of the root has 3 children
0 -> the leftmost child on the second level (whose grandparen is the root) has no children
1 -> the middle child on the second level has 1 child
0 -> the right most child on the second level has no children
3 -> the only node on the third level has 3 children
<empty> -> the nodes on the last level have no children

我的问题是获取节点子节点的索引。

我的想法是获取父节点索引的值,然后将计数器添加到它,我遇到的问题是如果节点没有任何子节点会发生什么?所有其他人都向右移动了1个。

请给我一些建议。

编辑:这是我用来生成树的代码块: 它必须构建给定序列的进程树

void ftree(int index, int parentIndex) {
    int i, tmp, pid, child;
    if(input[index] == 0){
        sleep(1);
    } else if(index >= inputSize) {
        sleep(1);
    } else if(index < inputSize) {
        for(i = 0; i < input[index]; i++) {
            if(parentIndex == -1) {
                child = 1;
            } else {
                child = index + input[parentIndex] + i; // here is the calculation of the index of the child
            }
            pid = fork();
            if (pid == 0) {
                ftree(child, index);
                break;
            }
        }
    }
    if(getpid() == pidOrg) {
        pid = fork();
        if(pid == 0) {
            execlp("pstree", "pstree", pidString, "-c", NULL); 
        } else {
            wait();
        }
    } else {
        wait();
    }
}

1 个答案:

答案 0 :(得分:1)

对我来说最简单的方法是首先构建树,然后分叉树并创建进程树。

为了构建树,我创建了一个代表节点的结构:

typedef struct _node {
    int val; // how many children the node has
    struct _node **children; // all the children of the node
} node, *pNode;

以及代表队列的结构:

typedef struct _queue {
    pNode el;
    struct _queueInt *next;
} queue, *pQueue;

然后我浏览了输入并将新节点添加到队列中(首先是手动创建根节点,然后是队列不为空的其他节点),同时构建树结构。

我发现ADT队列非常适合这个特殊问题。

特别感谢我的一位同事帮助我完成了这项任务。