已知一棵树的由根至叶子结点按层次输入的结点序列及每个结点的度,试写出构造此树的孩子-兄弟链表的c语言算法
时间: 2024-05-12 18:13:07 浏览: 100
树的孩子链表法实现(c语言)
假设输入的结点序列为nodeList,每个结点的度为degreeList,孩子-兄弟链表为treeList,算法如下:
```
#include <stdio.h>
#include <stdlib.h>
#define MAX_NODE_NUM 100 // 最大结点数
typedef struct TreeNode {
int data;
struct TreeNode *firstChild; // 第一个孩子结点
struct TreeNode *nextSibling; // 下一个兄弟结点
} TreeNode;
TreeNode *createTree(int nodeList[], int degreeList[], int n) {
TreeNode *treeList[MAX_NODE_NUM];
int i, j;
for (i = 0; i < n; i++) {
TreeNode *node = (TreeNode *)malloc(sizeof(TreeNode));
node->data = nodeList[i];
node->firstChild = NULL;
node->nextSibling = NULL;
treeList[i] = node;
}
TreeNode *root = treeList[0];
TreeNode *queue[MAX_NODE_NUM];
int front = 0, rear = 0;
queue[rear++] = root;
for (i = 1; i < n;) {
TreeNode *parent = queue[front];
front++;
for (j = 0; j < degreeList[i]; j++) {
parent->firstChild = treeList[i];
i++;
treeList[i - 1]->nextSibling = treeList[i];
queue[rear++] = treeList[i - 1];
}
}
return root;
}
void printTree(TreeNode *root) {
if (root != NULL) {
printf("%d ", root->data);
printTree(root->firstChild);
printTree(root->nextSibling);
}
}
int main() {
int nodeList[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int degreeList[] = {2, 3, 0, 2, 0, 0, 1, 0, 0, 0};
int n = sizeof(nodeList) / sizeof(int);
TreeNode *root = createTree(nodeList, degreeList, n);
printTree(root);
return 0;
}
```
算法思路:
1. 根据结点序列和度数数组创建结点数组treeList,并初始化每个结点的firstChild和nextSibling指针为NULL。
2. 将第一个结点作为根节点,并加入队列中。
3. 从第二个结点开始,按输入顺序一次遍历每个结点,对于每个结点,将其作为其父节点的孩子结点,并将其加入队列中,直到所有结点都被遍历完毕。
4. 返回根节点。
时间复杂度为O(n),空间复杂度为O(n)。
阅读全文