由双遍历序列构造二叉树 生成代码
时间: 2023-08-19 08:04:04 浏览: 38
好的,下面是一个以双遍历序列构造二叉树的示例代码(以先序遍历和中序遍历序列为例):
```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>& preorder, vector<int>& inorder) {
// 构造中序遍历序列中节点值到索引的映射
unordered_map<int, int> inorder_map;
for (int i = 0; i < inorder.size(); i++) {
inorder_map[inorder[i]] = i;
}
// 递归构造二叉树
return buildTreeHelper(preorder, 0, preorder.size() - 1, inorder, 0, inorder.size() - 1, inorder_map);
}
TreeNode* buildTreeHelper(vector<int>& preorder, int pre_left, int pre_right, vector<int>& inorder, int in_left, int in_right, unordered_map<int, int>& inorder_map) {
if (pre_left > pre_right) {
return nullptr;
}
int root_val = preorder[pre_left];
TreeNode* root = new TreeNode(root_val);
int root_index = inorder_map[root_val];
int left_subtree_size = root_index - in_left;
root->left = buildTreeHelper(preorder, pre_left + 1, pre_left + left_subtree_size, inorder, in_left, root_index - 1, inorder_map);
root->right = buildTreeHelper(preorder, pre_left + left_subtree_size + 1, pre_right, inorder, root_index + 1, in_right, inorder_map);
return root;
}
int main() {
vector<int> preorder = {3, 9, 20, 15, 7};
vector<int> inorder = {9, 3, 15, 20, 7};
TreeNode* root = buildTree(preorder, inorder);
// 遍历验证
cout << "Postorder traversal: ";
postorderTraversal(root);
cout << endl;
return 0;
}
```
这是一个以 C++ 实现的算法,可以通过先序遍历序列和中序遍历序列构造出一棵二叉树。其中 `buildTree()` 函数是主函数,`buildTreeHelper()` 函数是递归函数,`postorderTraversal()` 函数是后序遍历函数,可以用来验证构造出的二叉树是否正确。