设计一颗二叉树,采用二叉树链表作为存储结构,完成二叉树的建立,输入完全二叉树的先序序列,求出先序,中序,后序及按层遍历序列
时间: 2023-08-19 12:20:48 浏览: 95
好的,我来为您解答。
首先,我们需要了解一下完全二叉树的概念。完全二叉树是一种特殊的二叉树,除了最后一层外,其他层的节点个数都是满的,而最后一层的节点都靠左排列。因此,对于完全二叉树,可以采用数组来存储其节点,而不需要使用链表。
接下来,我们来构造一颗二叉树。我们可以定义一个二叉树的节点结构体:
```c
typedef struct TreeNode {
int data;
struct TreeNode *lchild, *rchild;
} TreeNode;
```
然后,我们可以通过递归的方式来构造二叉树。具体流程如下:
1. 如果输入的序列为空,则返回 NULL。
2. 取序列的第一个元素作为根节点。
3. 对于一个完全二叉树,它的左子树和右子树仍然是完全二叉树。因此,我们可以将序列分为两部分,第一部分是左子树的先序序列,第二部分是右子树的先序序列。
4. 递归构造左子树和右子树,并将它们赋值给根节点的左右子节点。
下面是完整的代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct TreeNode {
int data;
struct TreeNode *lchild, *rchild;
} TreeNode;
TreeNode *createTree(int pre[], int start, int end) {
if (start > end) {
return NULL;
}
TreeNode *root = (TreeNode *)malloc(sizeof(TreeNode));
root->data = pre[start];
root->lchild = NULL;
root->rchild = NULL;
int i;
for (i = start + 1; i <= end; i++) {
if (pre[i] > pre[start]) {
break;
}
}
root->lchild = createTree(pre, start + 1, i - 1);
root->rchild = createTree(pre, i, end);
return root;
}
void preOrder(TreeNode *root) {
if (root == NULL) {
return;
}
printf("%d ", root->data);
preOrder(root->lchild);
preOrder(root->rchild);
}
void inOrder(TreeNode *root) {
if (root == NULL) {
return;
}
inOrder(root->lchild);
printf("%d ", root->data);
inOrder(root->rchild);
}
void postOrder(TreeNode *root) {
if (root == NULL) {
return;
}
postOrder(root->lchild);
postOrder(root->rchild);
printf("%d ", root->data);
}
void levelOrder(TreeNode *root) {
if (root == NULL) {
return;
}
TreeNode *queue[1000];
int front = 0, rear = 0;
queue[rear++] = root;
while (front != rear) {
TreeNode *p = queue[front++];
printf("%d ", p->data);
if (p->lchild != NULL) {
queue[rear++] = p->lchild;
}
if (p->rchild != NULL) {
queue[rear++] = p->rchild;
}
}
}
int main() {
int pre[] = {1, 2, 4, 5, 3, 6, 7};
int len = sizeof(pre) / sizeof(int);
TreeNode *root = createTree(pre, 0, len - 1);
printf("先序遍历:");
preOrder(root);
printf("\n");
printf("中序遍历:");
inOrder(root);
printf("\n");
printf("后序遍历:");
postOrder(root);
printf("\n");
printf("按层遍历:");
levelOrder(root);
printf("\n");
return 0;
}
```
以上代码实现了先序、中序、后序和按层遍历四种遍历方式。如果您需要构造一颗非完全二叉树,可以使用链表来存储节点,然后按照上述方式递归构造树。
阅读全文