树和二叉树基本上都有先序、中序、后序、按层遍历等遍历顺序,给定中序和其它一种遍历的序列就可以确定一棵二叉树的结构。 假定一棵二叉树一个结点用一个字符描述,现在给出中序和按层遍历的字符串,求该树的先序遍历字符串。 输入 共两行,每行是由字母组成的字符串(一行的每个字符都是唯一的),分别表示二叉树的中序遍历和按层遍历的序列。 输出 就一行,表示二叉树的先序序列c++代码。
时间: 2024-04-22 18:24:18 浏览: 171
您好!根据您的描述,您想要根据给定的中序遍历和按层遍历序列,求得该树的先序遍历序列。下面是求解该问题的C++代码示例:
```cpp
#include <iostream>
#include <unordered_map>
#include <queue>
using namespace std;
struct Node {
char val;
Node* left;
Node* right;
};
Node* constructTree(string inorder, string levelorder) {
if (inorder.empty() || levelorder.empty())
return nullptr;
Node* root = new Node();
root->val = levelorder[0];
root->left = nullptr;
root->right = nullptr;
unordered_map<char, int> inMap;
for (int i = 0; i < inorder.length(); i++) {
inMap[inorder[i]] = i;
}
queue<Node*> q;
q.push(root);
int levelIndex = 1;
while (!q.empty() && levelIndex < levelorder.length()) {
Node* curr = q.front();
q.pop();
int inIndex = inMap[curr->val];
if (inIndex > 0 && levelIndex < levelorder.length()) {
Node* leftChild = new Node();
leftChild->val = levelorder[levelIndex];
leftChild->left = nullptr;
leftChild->right = nullptr;
curr->left = leftChild;
q.push(leftChild);
levelIndex++;
}
if (inIndex < inorder.length() - 1 && levelIndex < levelorder.length()) {
Node* rightChild = new Node();
rightChild->val = levelorder[levelIndex];
rightChild->left = nullptr;
rightChild->right = nullptr;
curr->right = rightChild;
q.push(rightChild);
levelIndex++;
}
}
return root;
}
void preorderTraversal(Node* root) {
if (root != nullptr) {
cout << root->val;
preorderTraversal(root->left);
preorderTraversal(root->right);
}
}
int main() {
string inorder, levelorder;
cin >> inorder >> levelorder;
Node* root = constructTree(inorder, levelorder);
preorderTraversal(root);
return 0;
}
```
您可以将中序遍历序列和按层遍历序列作为输入,运行以上代码,即可得到二叉树的先序遍历序列。希望能够帮到您!如果有任何疑问,请随时提出。
阅读全文