给出中序遍历前序遍历求后序遍历C语言
时间: 2025-05-01 15:08:53 浏览: 22
### 使用 C 语言通过中序遍历和前序遍历来计算二叉树的后序遍历
为了构建并输出给定二叉树的后序遍历序列,可以采用递归方法来解析前序遍历和中序遍历的结果。以下是具体实现方式:
#### 构建函数定义
首先定义节点结构体以及辅助函数用于创建新节点。
```c
typedef struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
} TreeNode;
TreeNode* newNode(int data) {
TreeNode* node = (TreeNode*)malloc(sizeof(TreeNode));
node->val = data;
node->left = NULL;
node->right = NULL;
return(node);
}
```
#### 主要逻辑流程
利用前序遍历的第一个元素作为当前子树的根节点,在中序遍历中找到该位置从而划分左右子树区域;接着对左右子树重复上述过程直至完成整个重建工作。最后执行一次完整的后序遍历打印操作即可获得所需结果[^1]。
#### 完整代码示例
下面是一个完整的程序例子展示如何基于此思路解决问题:
```c
#include <stdio.h>
#include <stdlib.h>
// ... 上述提到的新建节点函数 ...
void buildPostOrder(const int pre[], const int in[], int post[], int start, int end, static int& index){
if(start > end)
return ;
// 查找根节点在inorder中的位置
int i;
for(i=start ;i<=end;i++){
if(in[i]==pre[index])
break;
}
// 增加index访问下一个前序元素
++index;
// 首先处理左子树再处理右子树
buildPostOrder(pre,in,post,start,i-1,index);
// 处理右子树
buildPostOrder(pre,in,post,i+1,end,index);
// 将当前根节点加入到后序数组里
post[end-(start>0?start-1:0)] = in[i];
}
int main() {
int n;
scanf("%d", &n); // 节点数量
int preorder[n], inorder[n], postorder[n];
// 输入前序遍历顺序
for(int i=0; i<n; i++)
scanf("%d",&preorder[i]);
// 输入中序遍历顺序
for(int j=0; j<n; j++)
scanf("%d",&inorder[j]);
int idx = 0;
buildPostOrder(preorder, inorder, postorder, 0 , n-1,idx );
printf("后序遍历:");
for(int k=n-1;k>=0;k--)
printf("%d ",postorder[k]);
free(postorder);
return 0;
}
```
注意这里`buildPostOrder()` 函数实现了核心功能,并且注意到由于后序遍历时是从最底层开始向上返回值的特点,因此最终输出时需要逆向读取存储好的 `post[]` 数组[^3]。
阅读全文
相关推荐

















