根据二叉树的后序和中序遍历序列创建二叉树的存储结构,编写算法
时间: 2023-07-23 12:19:01 浏览: 54
根据后序遍历和中序遍历序列创建二叉树的步骤如下:
1. 后序遍历序列的最后一个元素为根节点。
2. 在中序遍历序列中找到根节点的位置,根节点左边的元素为左子树的中序遍历序列,右边的元素为右子树的中序遍历序列。
3. 确定左子树的后序遍历序列和右子树的后序遍历序列。
4. 递归地对左子树和右子树分别进行步骤1-3,创建左子树和右子树。
下面是基于上述步骤的具体算法实现(假设后序遍历序列存储在数组postorder中,中序遍历序列存储在数组inorder中):
```
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
if (inorder.empty() || postorder.empty()) {
return nullptr;
}
int rootValue = postorder.back();
auto root = new TreeNode(rootValue);
auto itr = find(inorder.begin(), inorder.end(), rootValue);
vector<int> leftInorder(inorder.begin(), itr);
vector<int> rightInorder(itr + 1, inorder.end());
vector<int> leftPostorder(postorder.begin(), postorder.begin() + leftInorder.size());
vector<int> rightPostorder(postorder.begin() + leftInorder.size(), postorder.end() - 1);
root->left = buildTree(leftInorder, leftPostorder);
root->right = buildTree(rightInorder, rightPostorder);
return root;
}
```
这个算法的时间复杂度是$O(n^2)$,其中n是二叉树的节点数。可以通过添加一个哈希表来优化时间复杂度为$O(n)$。