编写算法根据二叉树的前序序列和中序序列建立二叉树。使用cpp,编写完整源代码
时间: 2023-06-11 19:07:49 浏览: 146
1两种序列创建二叉树.cpp
以下是使用 C++ 编写的建立二叉树的完整源代码:
```cpp
#include <iostream>
#include <unordered_map>
#include <vector>
using namespace std;
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};
class Solution {
public:
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
if (preorder.empty() || inorder.empty()) return nullptr;
unordered_map<int, int> inorder_map;
for (int i = 0; i < inorder.size(); ++i) {
inorder_map[inorder[i]] = i;
}
return buildTree(preorder, 0, preorder.size() - 1, inorder_map, 0, inorder.size() - 1);
}
TreeNode* buildTree(vector<int>& preorder, int pre_left, int pre_right,
unordered_map<int, int>& inorder_map, int in_left, int in_right) {
if (pre_left > pre_right || in_left > in_right) return nullptr;
int root_val = preorder[pre_left];
TreeNode* root = new TreeNode(root_val);
int inorder_root_index = inorder_map[root_val];
int left_subtree_size = inorder_root_index - in_left;
root->left = buildTree(preorder, pre_left + 1, pre_left + left_subtree_size, inorder_map, in_left, inorder_root_index - 1);
root->right = buildTree(preorder, pre_left + left_subtree_size + 1, pre_right, inorder_map, inorder_root_index + 1, in_right);
return root;
}
};
int main() {
vector<int> preorder {3, 9, 20, 15, 7};
vector<int> inorder {9, 3, 15, 20, 7};
Solution sol;
TreeNode* root = sol.buildTree(preorder, inorder);
cout << "Preorder traversal: ";
// Expected output: 3 9 20 15 7
function<void(TreeNode*)> preorder_traversal = [&](TreeNode* node) {
if (!node) return;
cout << node->val << " ";
preorder_traversal(node->left);
preorder_traversal(node->right);
};
preorder_traversal(root);
cout << endl;
cout << "Inorder traversal: ";
// Expected output: 9 3 15 20 7
function<void(TreeNode*)> inorder_traversal = [&](TreeNode* node) {
if (!node) return;
inorder_traversal(node->left);
cout << node->val << " ";
inorder_traversal(node->right);
};
inorder_traversal(root);
cout << endl;
return 0;
}
```
该算法的思路是:根据前序序列的第一个元素可以确定二叉树的根节点,然后在中序序列中找到根节点的位置,根节点左边的部分就是左子树的中序序列,右边的部分就是右子树的中序序列。根据左子树的中序序列的长度可以在前序序列中确定左子树的前序序列,右子树同理。然后递归地建立左子树和右子树即可。
在代码实现中,我们使用哈希表来存储中序序列中每个元素的下标,这样可以快速地找到根节点在中序序列中的位置。函数 `buildTree` 的参数含义分别是:前序序列、前序序列中待建立子树的左右边界、中序序列哈希表、中序序列中待建立子树的左右边界。函数先判断边界是否合法,如果不合法就返回空指针。然后按照上述思路建立根节点和左右子树即可。
阅读全文