根据二叉树的后序和中序遍历序列创建二叉树的存储结构,,编写算法
时间: 2023-07-22 08:18:37 浏览: 96
根据后序和中序遍历序列创建二叉树的存储结构,可以按照以下步骤进行:
1. 后序遍历序列的最后一个节点为根节点,将其作为二叉树的根节点。
2. 在中序遍历序列中找到根节点的位置,根节点左侧的节点为左子树节点,右侧的节点为右子树节点。
3. 根据左子树和右子树的节点数量,将后序遍历序列分割成两个部分,分别对应左子树和右子树的后序遍历序列。
4. 递归地对左子树和右子树进行步骤1~3,构建二叉树的左右子树。
以下是基于上述思路的实现代码(C++):
```
#include <iostream>
#include <vector>
#include <unordered_map>
using namespace std;
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};
TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
// 建立中序遍历节点值到索引的映射
unordered_map<int, int> inorder_map;
for (int i = 0; i < inorder.size(); ++i) {
inorder_map[inorder[i]] = i;
}
// 递归构建二叉树
return buildTreeHelper(inorder, postorder, inorder_map, 0, inorder.size() - 1, 0, postorder.size() - 1);
}
TreeNode* buildTreeHelper(vector<int>& inorder, vector<int>& postorder,
unordered_map<int, int>& inorder_map,
int inorder_left, int inorder_right,
int postorder_left, int postorder_right) {
if (inorder_left > inorder_right) {
return nullptr;
}
// 后序遍历序列的最后一个节点为根节点
int root_val = postorder[postorder_right];
TreeNode* root = new TreeNode(root_val);
// 在中序遍历序列中找到根节点的位置
int inorder_root_index = inorder_map[root_val];
int left_subtree_size = inorder_root_index - inorder_left;
// 递归构建左右子树
root->left = buildTreeHelper(inorder, postorder, inorder_map,
inorder_left, inorder_root_index - 1,
postorder_left, postorder_left + left_subtree_size - 1);
root->right = buildTreeHelper(inorder, postorder, inorder_map,
inorder_root_index + 1, inorder_right,
postorder_left + left_subtree_size, postorder_right - 1);
return root;
}
```
该算法的时间复杂度为 $O(n)$,其中 $n$ 为二叉树的节点数。算法的空间复杂度为 $O(n)$,主要来自于递归栈的空间开销。
阅读全文