层次遍历+中序遍历
作者:
lucky12138
,
2024-06-20 11:38:33
,
所有人可见
,
阅读 3
#include <bits/stdc++.h>
using namespace std;
string InOrder, LevelOrder;
unordered_map<char, int> positionMap; // 存放位置和数据之间的关系
void getPreOrder(int l1, int r1, int l2, int r2) {
if (l1 > r1) return; // 如果 InOrder 范围无效,返回
// 找到根节点:在 LevelOrder 中找到第一个出现在 InOrder 范围内的元素,即为根
int rootIndex = -1;
for (int i = l2; i <= r2; ++i) {
if (positionMap.find(LevelOrder[i]) != positionMap.end() && positionMap[LevelOrder[i]] >= l1 && positionMap[LevelOrder[i]] <= r1) {
rootIndex = positionMap[LevelOrder[i]];
cout << LevelOrder[i]; // 输出根节点(前序遍历)
break;
}
}
if (rootIndex == -1) return; // 如果没有找到根节点,返回
// 递归处理左子树
getPreOrder(l1, rootIndex - 1, l2, r2);
// 递归处理右子树
getPreOrder(rootIndex + 1, r1, l2, r2);
}
int main() {
cin >> InOrder >> LevelOrder;
// 初始化中序遍历位置和数据之间的关系
for (int i = 0; i < InOrder.size(); ++i) {
positionMap[InOrder[i]] = i;
}
getPreOrder(0, InOrder.size() - 1, 0, LevelOrder.size() - 1);//层序遍历永远不变
return 0;
}
都记录了中序遍历的下标和数据之间的关系