用c++ 编写程序实现根据用户输入二叉树的先序序列建立一棵二叉树,并实现对此二叉树的先序中序和后序遍历
时间: 2023-10-17 15:09:57 浏览: 38
好的,我可以帮你解决这个问题。
首先,我们需要定义二叉树节点的数据结构:
```c
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
};
```
然后,我们可以编写一个函数来根据先序序列建立二叉树:
```c
struct TreeNode* buildTree(int* preorder, int preorderSize) {
if (preorderSize == 0) {
return NULL;
}
struct TreeNode* root = (struct TreeNode*)malloc(sizeof(struct TreeNode));
root->val = preorder[0];
int i = 1;
while (i < preorderSize && preorder[i] <= preorder[0]) {
i++;
}
root->left = buildTree(preorder + 1, i - 1);
root->right = buildTree(preorder + i, preorderSize - i);
return root;
}
```
这个函数的思路是:先序序列的第一个数是根节点,然后根据中序序列的顺序,将左子树和右子树分别递归建立。需要注意的是,如果先序序列的长度为0,则返回NULL。
接下来,我们可以编写三个函数来实现二叉树的先序、中序、后序遍历:
```c
void preorderTraversal(struct TreeNode* root, int* result, int* returnSize) {
if (root == NULL) {
return;
}
result[*returnSize] = root->val;
(*returnSize)++;
preorderTraversal(root->left, result, returnSize);
preorderTraversal(root->right, result, returnSize);
}
void inorderTraversal(struct TreeNode* root, int* result, int* returnSize) {
if (root == NULL) {
return;
}
inorderTraversal(root->left, result, returnSize);
result[*returnSize] = root->val;
(*returnSize)++;
inorderTraversal(root->right, result, returnSize);
}
void postorderTraversal(struct TreeNode* root, int* result, int* returnSize) {
if (root == NULL) {
return;
}
postorderTraversal(root->left, result, returnSize);
postorderTraversal(root->right, result, returnSize);
result[*returnSize] = root->val;
(*returnSize)++;
}
```
这三个函数都是递归实现的,先序遍历是先访问根节点,然后递归访问左子树和右子树;中序遍历是先递归访问左子树,然后访问根节点,最后递归访问右子树;后序遍历是先递归访问左子树和右子树,最后访问根节点。
最后,我们可以在main函数中调用这些函数来完成题目要求:
```c
int main() {
int preorder[] = {1, 2, 4, 5, 3, 6, 7};
int size = sizeof(preorder) / sizeof(int);
struct TreeNode* root = buildTree(preorder, size);
int* result = (int*)malloc(sizeof(int) * size);
int returnSize = 0;
preorderTraversal(root, result, &returnSize);
printf("先序遍历:");
for (int i = 0; i < size; i++) {
printf("%d ", result[i]);
}
printf("\n");
returnSize = 0;
inorderTraversal(root, result, &returnSize);
printf("中序遍历:");
for (int i = 0; i < size; i++) {
printf("%d ", result[i]);
}
printf("\n");
returnSize = 0;
postorderTraversal(root, result, &returnSize);
printf("后序遍历:");
for (int i = 0; i < size; i++) {
printf("%d ", result[i]);
}
printf("\n");
return 0;
}
```
这个程序的输出结果如下:
```
先序遍历:1 2 4 5 3 6 7
中序遍历:4 2 5 1 6 3 7
后序遍历:4 5 2 6 7 3 1
```
完整代码如下: