用先序和中序序列创建二叉树并进行后序遍历c语言
时间: 2023-07-27 20:16:45 浏览: 78
c语言遍历二叉树包括前序,中序,后序
5星 · 资源好评率100%
好的,这是一个关于C语言和二叉树的问题。
首先,我们需要定义二叉树的数据结构:
```c
struct TreeNode {
int val;
struct TreeNode* left;
struct TreeNode* right;
};
```
接下来,我们可以编写一个函数来根据先序和中序序列创建二叉树:
```c
struct TreeNode* buildTree(int* preorder, int preorderSize, int* inorder, int inorderSize) {
if (preorderSize == 0 || inorderSize == 0) {
return NULL;
}
int rootVal = preorder[0];
struct TreeNode* root = (struct TreeNode*)malloc(sizeof(struct TreeNode));
root->val = rootVal;
int rootIndex = 0;
for (int i = 0; i < inorderSize; i++) {
if (inorder[i] == rootVal) {
rootIndex = i;
break;
}
}
root->left = buildTree(preorder + 1, rootIndex, inorder, rootIndex);
root->right = buildTree(preorder + rootIndex + 1, preorderSize - rootIndex - 1, inorder + rootIndex + 1, inorderSize - rootIndex - 1);
return root;
}
```
上述代码中,我们使用递归的方式来根据先序和中序序列创建二叉树。先序序列的第一个元素为根节点,通过在中序序列中找到根节点的位置,可以将中序序列分为左子树和右子树两部分。然后,递归地调用 buildTree 函数来分别构建左子树和右子树。
接下来,我们可以编写一个函数来进行后序遍历:
```c
void postorderTraversal(struct TreeNode* root) {
if (root != NULL) {
postorderTraversal(root->left);
postorderTraversal(root->right);
printf("%d ", root->val);
}
}
```
上述代码中,我们使用递归的方式来进行后序遍历。先遍历左子树,再遍历右子树,最后访问根节点。
最终的代码如下所示:
```c
#include <stdio.h>
#include <stdlib.h>
struct TreeNode {
int val;
struct TreeNode* left;
struct TreeNode* right;
};
struct TreeNode* buildTree(int* preorder, int preorderSize, int* inorder, int inorderSize) {
if (preorderSize == 0 || inorderSize == 0) {
return NULL;
}
int rootVal = preorder[0];
struct TreeNode* root = (struct TreeNode*)malloc(sizeof(struct TreeNode));
root->val = rootVal;
int rootIndex = 0;
for (int i = 0; i < inorderSize; i++) {
if (inorder[i] == rootVal) {
rootIndex = i;
break;
}
}
root->left = buildTree(preorder + 1, rootIndex, inorder, rootIndex);
root->right = buildTree(preorder + rootIndex + 1, preorderSize - rootIndex - 1, inorder + rootIndex + 1, inorderSize - rootIndex - 1);
return root;
}
void postorderTraversal(struct TreeNode* root) {
if (root != NULL) {
postorderTraversal(root->left);
postorderTraversal(root->right);
printf("%d ", root->val);
}
}
int main() {
int preorder[] = {1, 2, 4, 5, 3};
int inorder[] = {4, 2, 5, 1, 3};
int size = sizeof(preorder) / sizeof(int);
struct TreeNode* root = buildTree(preorder, size, inorder, size);
postorderTraversal(root);
printf("\n");
return 0;
}
```
运行结果如下所示:
```
4 5 2 3 1
```
阅读全文