用c++语言写后序和中序序列构造二叉树
时间: 2024-05-09 21:17:47 浏览: 75
好的,这个问题可以回答。下面是用C语言实现后序和中序序列构造二叉树的代码:
```
#include <stdio.h>
#include <stdlib.h>
#define MAX_LENGTH 100 // 定义最大长度
int postOrder[MAX_LENGTH]; // 定义后序遍历数组
int inOrder[MAX_LENGTH]; // 定义中序遍历数组
struct Node {
int data; //结点元素值
struct Node* left; //左子树
struct Node* right; //右子树
};
struct Node* buildTree(int postStart, int postEnd, int inStart, int inEnd) {
if (postStart > postEnd || inStart > inEnd) { //边界条件
return NULL;
}
int rootValue = postOrder[postEnd]; //获取根节点
struct Node* root = (struct Node*)malloc(sizeof(struct Node)); //构造新的节点
root->data = rootValue;
int k = 0; // 寻找中序序列中根节点的位置,并划分左右子树
for (int i = inStart; i <= inEnd; i++) {
if (inOrder[i] == rootValue) {
k = i;
break;
}
}
root->left = buildTree(postStart, postStart + k - inStart - 1, inStart, k - 1); //构造左子树
root->right = buildTree(postStart + k - inStart, postEnd - 1, k + 1, inEnd); //构造右子树
return root;
}
void inOrderTraversal(struct Node* root) { //中序遍历
if (root == NULL) {
return;
}
inOrderTraversal(root->left);
printf("%d ", root->data);
inOrderTraversal(root->right);
}
int main() {
int n;
scanf("%d", &n); //输入节点个数
for (int i = 0; i < n; i++) {
scanf("%d", &postOrder[i]); //输入后序序列
}
for (int i = 0; i < n; i++) {
scanf("%d", &inOrder[i]); //输入中序序列
}
struct Node* root = buildTree(0, n - 1, 0, n - 1); //构造二叉树
inOrderTraversal(root); //中序遍历输出
return 0;
}
```
希望对你有所帮助!
阅读全文