用C++完善下面这段根据后序和中序遍历输出先序遍历的程序#include <stdio.h> #include <stdlib.h> #define MAXN 30 typedef int ElementType; /* 定义二叉树结点 */ typedef struct TNode* Position; typedef Position BinTree; struct TNode { ElementType data; struct node* left; struct node* right; }; BinTree BuildTree(int Indorder[], int Postorder[], int N); void PreorderTraversal(BinTree BT); int main() { BinTree T; int Inorder[MAXN], Postorder[MAXN], N, i; /*参数输入*/ scanf("%d", &N); for (i = 0;i < N;i++) scanf("%d", &Postorder[i]); for (i = 0;i < N;i++) scanf("%d", &Inorder[i]); T = BuildTree(Inorder, Postorder, N); printf("Preorder:"); PreorderTraversal(T); printf("\n"); } BinTree BuildTree(int Inorder[], int Postorder[], int N) { }
时间: 2024-01-13 21:05:22 浏览: 69
完善后的程序如下:
```cpp
#include <stdio.h>
#include <stdlib.h>
#define MAXN 30
typedef int ElementType;
/* 定义二叉树结点 */
typedef struct TNode* Position;
typedef Position BinTree;
struct TNode {
ElementType data;
struct TNode* left;
struct TNode* right;
};
BinTree BuildTree(int Inorder[], int Postorder[], int N);
void PreorderTraversal(BinTree BT);
int main() {
BinTree T;
int Inorder[MAXN], Postorder[MAXN], N, i;
/*参数输入*/
scanf("%d", &N);
for (i = 0; i < N; i++) scanf("%d", &Postorder[i]);
for (i = 0; i < N; i++) scanf("%d", &Inorder[i]);
T = BuildTree(Inorder, Postorder, N);
printf("Preorder:");
PreorderTraversal(T);
printf("\n");
return 0;
}
BinTree BuildTree(int Inorder[], int Postorder[], int N) {
if (N == 0) return NULL; // 如果结点数为0,直接返回NULL
int rootVal = Postorder[N - 1]; // 后序遍历的最后一个结点就是根结点
BinTree root = (BinTree)malloc(sizeof(struct TNode)); // 为根结点分配内存
root->data = rootVal; // 将根结点的值设为rootVal
int k = 0; // 找到中序遍历中根结点所在的位置
for (int i = 0; i < N; i++) {
if (Inorder[i] == rootVal) {
k = i;
break;
}
}
root->left = BuildTree(Inorder, Postorder, k); // 递归构建左子树
root->right = BuildTree(Inorder + k + 1, Postorder + k, N - k - 1); // 递归构建右子树
return root; // 返回根结点
}
void PreorderTraversal(BinTree BT) {
if (BT == NULL) return; // 如果是空树,则直接返回
printf("%d ", BT->data); // 先输出根结点
PreorderTraversal(BT->left); // 递归输出左子树
PreorderTraversal(BT->right); // 递归输出右子树
}
```
这个程序中,先通过后序遍历找到根结点,然后在中序遍历中找到根结点所在的位置,将中序遍历分割成左子树和右子树两部分。然后再递归地构建左子树和右子树。
最后在 `PreorderTraversal` 函数中进行先序遍历输出即可。
阅读全文