二叉樹 T 的中序遍歷:`B A F D G C E`
層次遍歷:`A B C D E F G`
畫出該二叉樹。
A
/ \
B C
/ \
D E
/ \
F G
TreeNode* buildTree(vector& level, vector& in) {
if (level.empty()) return nullptr;
int rootVal = level[0];
TreeNode* root = new TreeNode(rootVal);
auto it = find(in.begin(), in.end(), rootVal);
vector inLeft(in.begin(), it);
vector inRight(it + 1, in.end());
// 從 level[1:] 中按 inLeft/inRight 篩選出左右子樹的層次序列
vector levelLeft, levelRight;
for (int i = 1; i < level.size(); ++i) {
if (binary_search(inLeft.begin(), inLeft.end(), level[i])) // 需排序或用 unordered_set
levelLeft.push_back(level[i]);
else
levelRight.push_back(level[i]);
}
root->left = buildTree(levelLeft, inLeft);
root->right = buildTree(levelRight, inRight);
return root;
}
**核心洞見:層次遍歷給根與「橫向順序」,中序遍歷給「縱向劃分」,兩者結合即可唯一確定樹。**