用c语言具体实现 定一棵二叉树的先序遍历和中序遍历序列,求其后序遍历序列
时间: 2023-03-19 15:22:33 浏览: 136
给定一棵二叉树的先序遍历序列preorder和中序遍历序列inorder,我们可以通过以下步骤来构建这棵二叉树:
1. 从preorder中取出第一个元素作为树的根节点。
2. 在inorder中找到根节点的位置,将inorder分为左子树和右子树两部分。
3. 递归处理左子树,将左子树的先序遍历序列和中序遍历序列传入递归函数,构造左子树。
4. 递归处理右子树,将右子树的先序遍历序列和中序遍历序列传入递归函数,构造右子树。
构造完整棵二叉树后,对其进行后序遍历即可得到后序遍历序列。
具体实现代码如下:
```c
#include <stdio.h>
#include <stdlib.h>
// 二叉树结点定义
typedef struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
} TreeNode;
// 根据先序遍历序列和中序遍历序列构造二叉树
TreeNode *buildTree(int *preorder, int preorderSize, int *inorder, int inorderSize) {
if (preorderSize == 0) {
return NULL;
}
int rootVal = preorder[0];
int i = 0;
for (; i < inorderSize; i++) {
if (inorder[i] == rootVal) {
break;
}
}
TreeNode *root = (TreeNode *) malloc(sizeof(TreeNode));
root->val = rootVal;
root->left = buildTree(preorder + 1, i, inorder, i);
root->right = buildTree(preorder + i + 1, preorderSize - i - 1, inorder + i + 1, inorderSize - i - 1);
return root;
}
// 后序遍历二叉树
void postorderTraversal(TreeNode *root) {
if (root == NULL) {
return;
}
postorderTraversal(root->left);
postorderTraversal(root->right);
printf("%d ", root->val);
}
int main() {
int preorder[] = {1, 2, 4, 5, 3, 6, 7};
int inorder[] = {4, 2, 5, 1, 6, 3, 7};
int n = sizeof(preorder) / sizeof(int);
TreeNode *root = buildTree(preorder, n, inorder, n);
printf("后序遍历序列:");
postorderTraversal(root);
printf("\n");
return 0;
}
```
这个程序的输出结果是:
```
后序遍历序列:4 5 2 6 7 3 1
```
因此,对于给定的先序遍历序列{1, 2, 4, 5, 3, 6, 7}和中序遍历序列{4, 2, 5, 1, 6, 3, 7},它们构造
阅读全文