用c根据后序和中序遍历输出先序遍历
时间: 2024-03-18 13:17:56 浏览: 85
根据中序遍历和后序遍历可以确定一棵唯一的二叉树,因此可以通过递归的方式输出先序遍历。具体实现方法如下:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_SIZE 100
// 树节点结构体
typedef struct TreeNode {
char data;
struct TreeNode *left;
struct TreeNode *right;
} TreeNode;
// 根据中序遍历和后序遍历构建二叉树
TreeNode* buildTree(char* inorder, char* postorder, int inorderStart, int inorderEnd, int postorderStart, int postorderEnd) {
if (inorderStart > inorderEnd || postorderStart > postorderEnd) {
return NULL;
}
// 后序遍历的最后一个元素即为根节点
char rootData = postorder[postorderEnd];
TreeNode* root = (TreeNode*)malloc(sizeof(TreeNode));
root->data = rootData;
// 在中序遍历中找到根节点的位置
int rootIndex = 0;
for (int i = inorderStart; i <= inorderEnd; i++) {
if (inorder[i] == rootData) {
rootIndex = i;
break;
}
}
// 递归构建左右子树
root->left = buildTree(inorder, postorder, inorderStart, rootIndex - 1, postorderStart, postorderStart + rootIndex - inorderStart - 1);
root->right = buildTree(inorder, postorder, rootIndex + 1, inorderEnd, postorderStart + rootIndex - inorderStart, postorderEnd - 1);
return root;
}
// 先序遍历二叉树
void preorder(TreeNode* root) {
if (root == NULL) {
return;
}
printf("%c ", root->data);
preorder(root->left);
preorder(root->right);
}
int main() {
// 读入中序遍历和后序遍历
char inorder[MAX_SIZE], postorder[MAX_SIZE];
printf("请输入中序遍历序列:");
fgets(inorder, MAX_SIZE, stdin);
inorder[strlen(inorder) - 1] = '\0';
printf("请输入后序遍历序列:");
fgets(postorder, MAX_SIZE, stdin);
postorder[strlen(postorder) - 1] = '\0';
// 构建二叉树
TreeNode* root = buildTree(inorder, postorder, 0, strlen(inorder) - 1, 0, strlen(postorder) - 1);
// 输出先序遍历序列
printf("先序遍历序列为:");
preorder(root);
printf("\n");
return 0;
}
```
这里使用了递归的方式构建二叉树,并通过先序遍历的方式输出二叉树的节点。时间复杂度为 O(n^2),其中 n 为二叉树的节点数。
阅读全文