写代码,用c++先用先序遍历构建二叉树,再按中序方式输出二叉树中各结点的值及其层次数。
时间: 2024-05-15 13:14:05 浏览: 87
二叉树的先序、中序、后序、分层遍历C++实现
4星 · 用户满意度95%
好的,以下是代码实现:
```c++
#include <iostream>
#include <vector>
using namespace std;
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};
TreeNode* buildTreeHelper(vector<int>& preorder, int pl, int pr,
vector<int>& inorder, int il, int ir) {
if (pl > pr || il > ir) {
return nullptr;
}
TreeNode* root = new TreeNode(preorder[pl]);
int k = il;
while (k <= ir && inorder[k] != preorder[pl]) {
++k;
}
root->left = buildTreeHelper(preorder, pl + 1, pl + k - il, inorder, il, k - 1);
root->right = buildTreeHelper(preorder, pl + k - il + 1, pr, inorder, k + 1, ir);
return root;
}
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
if (preorder.empty() || inorder.empty()) {
return nullptr;
}
return buildTreeHelper(preorder, 0, preorder.size() - 1, inorder, 0, inorder.size() - 1);
}
void printTree(TreeNode* root, int level) {
if (root == nullptr) {
return;
}
printTree(root->left, level + 1);
cout << root->val << " " << level << endl;
printTree(root->right, level + 1);
}
int main() {
vector<int> preorder = {1, 2, 4, 5, 3, 6, 7};
vector<int> inorder = {4, 2, 5, 1, 6, 3, 7};
TreeNode* root = buildTree(preorder, inorder);
printTree(root, 0);
return 0;
}
```
这里我们使用了一个辅助函数 `buildTreeHelper` 来实现二叉树的构建,该函数采用递归的方式实现。
具体来说,我们可以通过先序遍历序列和中序遍历序列来构建二叉树。对于每次构建根节点时,我们在中序遍历序列中找到根节点的位置,以此将中序遍历序列分成左子树和右子树两个部分。然后,我们可以递归地构建左右子树,并将左右子树连接到根节点上。
构建好二叉树之后,我们可以采用中序遍历的方式输出各节点的值和层次数。这里我们使用了另一个递归函数 `printTree` 来实现,其中 `level` 表示当前节点所处的层次。具体来说,我们先递归遍历左子树,然后输出当前节点的值和层次数,最后递归遍历右子树。
阅读全文