数据结构由中序序列和后序序列构造二叉树
时间: 2023-12-27 16:05:19 浏览: 73
php-leetcode题解之从中序与后序遍历序列构造二叉树.zip
构造二叉树的过程可以通过递归实现。具体步骤如下:
1. 后序序列的最后一个元素为根节点。
2. 在中序序列中找到根节点的位置,根节点左边的元素为左子树的中序序列,右边的元素为右子树的中序序列。
3. 根据左子树的中序序列和后序序列递归构造左子树。
4. 根据右子树的中序序列和后序序列递归构造右子树。
5. 将左子树和右子树分别作为根节点的左右子树。
下面是C语言的代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
} TreeNode;
int findRoot(int *inorder, int inStart, int inEnd, int rootVal) {
for (int i = inStart; i <= inEnd; i++) {
if (inorder[i] == rootVal) {
return i;
}
}
return -1;
}
TreeNode* buildTree(int* inorder, int inorderSize, int* postorder, int postorderSize) {
if (inorderSize == 0 || postorderSize == 0) {
return NULL;
}
int rootVal = postorder[postorderSize - 1];
TreeNode *root = (TreeNode*)malloc(sizeof(TreeNode));
root->val = rootVal;
int rootIndex = findRoot(inorder, 0, inorderSize - 1, rootVal);
int leftSize = rootIndex;
int rightSize = inorderSize - rootIndex - 1;
root->left = buildTree(inorder, leftSize, postorder, leftSize);
root->right = buildTree(inorder + rootIndex + 1, rightSize, postorder + leftSize, rightSize);
return root;
}
void inorderTraversal(TreeNode *root) {
if (root == NULL) {
return;
}
inorderTraversal(root->left);
printf("%d ", root->val); inorderTraversal(root->right);
}
int main() {
int inorder[] = {9, 3, 15, 20, 7};
int postorder[] = {9, 15, 7, 20, 3};
TreeNode *root = buildTree(inorder, 5, postorder, 5);
inorderTraversal(root);
return 0;
}
```
阅读全文