运用层次遍历法,结合链队列,创建链式存储的二叉树
时间: 2023-12-07 20:04:34 浏览: 64
由先序和中序遍历序列,构造二叉树链式存储结构
5星 · 资源好评率100%
好的,我来回答你的问题。
首先,需要明确一下链式存储的二叉树是怎么定义的。它的每个结点包含三个域,分别是数据域、左孩子指针域和右孩子指针域。如果某个结点没有左孩子或右孩子,对应指针域的值为 NULL。
接下来,我们来看如何利用层次遍历法和链队列来创建这个二叉树。
1. 定义一个结构体来表示二叉树的结点,包含数据域和左右孩子指针域:
```
struct TreeNode {
int data;
struct TreeNode *left;
struct TreeNode *right;
};
```
2. 定义一个链队列的结点,包含数据域和指向下一个结点的指针域:
```
struct QueueNode {
struct TreeNode *data;
struct QueueNode *next;
};
```
3. 定义一个链队列,包含队头和队尾指针:
```
struct Queue {
struct QueueNode *front;
struct QueueNode *rear;
};
```
4. 实现链队列的入队和出队操作:
```
void enqueue(struct Queue *queue, struct TreeNode *data) {
struct QueueNode *new_node = (struct QueueNode *)malloc(sizeof(struct QueueNode));
new_node->data = data;
new_node->next = NULL;
if (queue->rear) {
queue->rear->next = new_node;
queue->rear = new_node;
} else {
queue->front = queue->rear = new_node;
}
}
struct TreeNode *dequeue(struct Queue *queue) {
if (queue->front) {
struct QueueNode *temp = queue->front;
struct TreeNode *data = temp->data;
queue->front = queue->front->next;
if (!queue->front) {
queue->rear = NULL;
}
free(temp);
return data;
}
return NULL;
}
```
5. 实现创建二叉树的函数,其中参数是一个数组,表示按层次遍历的顺序排列的结点值。函数返回一个指向根结点的指针:
```
struct TreeNode *createTree(int *nodes, int size) {
if (!nodes || size == 0) {
return NULL;
}
struct TreeNode *root = (struct TreeNode *)malloc(sizeof(struct TreeNode));
root->data = nodes[0];
root->left = root->right = NULL;
struct Queue *queue = (struct Queue *)malloc(sizeof(struct Queue));
queue->front = queue->rear = NULL;
enqueue(queue, root);
int i = 1;
while (i < size) {
struct TreeNode *parent = dequeue(queue);
struct TreeNode *left = NULL, *right = NULL;
if (nodes[i] != -1) {
left = (struct TreeNode *)malloc(sizeof(struct TreeNode));
left->data = nodes[i];
left->left = left->right = NULL;
enqueue(queue, left);
}
if (i + 1 < size && nodes[i + 1] != -1) {
right = (struct TreeNode *)malloc(sizeof(struct TreeNode));
right->data = nodes[i + 1];
right->left = right->right = NULL;
enqueue(queue, right);
}
parent->left = left;
parent->right = right;
i += 2;
}
return root;
}
```
6. 最后,调用 createTree 函数来创建二叉树,并进行测试:
```
int main() {
int nodes[] = {1, 2, 3, 4, 5, -1, 6, -1, -1, 7};
struct TreeNode *root = createTree(nodes, sizeof(nodes) / sizeof(int));
// TODO: 测试二叉树的遍历等操作
return 0;
}
```
这样,我们就利用层次遍历法和链队列,创建了一个链式存储的二叉树。
阅读全文