用完整的c++代码写先序遍历和中序遍历构树
时间: 2024-04-08 22:30:10 浏览: 62
当然,请参考下面的完整C++代码示例:
```cpp
#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 buildSubTree(preorder, 0, preorder.size() - 1, inorder, 0, inorder.size() - 1, inorder_map);
}
TreeNode* buildSubTree(vector<int>& preorder, int pre_start, int pre_end,
vector<int>& inorder, int in_start, int in_end,
unordered_map<int, int>& inorder_map) {
if (pre_start > pre_end || in_start > in_end) {
return nullptr;
}
int root_val = preorder[pre_start];
TreeNode* root = new TreeNode(root_val);
int root_index = inorder_map[root_val];
int left_subtree_size = root_index - in_start;
root->left = buildSubTree(preorder, pre_start + 1, pre_start + left_subtree_size,
inorder, in_start, root_index - 1,
inorder_map);
root->right = buildSubTree(preorder, pre_start + left_subtree_size + 1, pre_end,
inorder, root_index + 1, in_end,
inorder_map);
return root;
}
void printInorder(TreeNode* root) {
if (root == nullptr) {
return;
}
printInorder(root->left);
cout << root->val << " ";
printInorder(root->right);
}
int main() {
vector<int> preorder = {3, 9, 20, 15, 7};
vector<int> inorder = {9, 3, 15, 20, 7};
TreeNode* root = buildTree(preorder, inorder);
cout << "Inorder Traversal of the constructed tree: ";
printInorder(root);
return 0;
}
```
这段代码先定义了一个`TreeNode`结构体,表示二叉树的节点。然后定义了`buildTree`函数来构建二叉树。在`buildTree`函数中,首先使用哈希表`inorder_map`存储中序遍历中每个节点值对应的索引。然后调用`buildSubTree`递归构建子树。`buildSubTree`函数根据先序遍历和中序遍历的范围以及哈希表,找到当前子树的根节点,并根据根节点在中序遍历中的位置将先序遍历和中序遍历分为左子树和右子树。最后,递归构建左子树和右子树,并返回根节点。
在`main`函数中,定义了先序遍历和中序遍历的序列,并调用`buildTree`函数构建二叉树。最后,使用`printInorder`函数打印构建的二叉树的中序遍历结果。
希望这个C++代码能够帮助到你!
阅读全文