根据后续和中序遍历输出前序遍历
时间: 2024-03-07 14:24:52 浏览: 40
已知中序遍历和后序遍历求前序遍历
由于前序遍历的顺序是 根-左-右,而中序遍历的顺序是 左-根-右,因此可以根据中序遍历的顺序确定根节点的位置,然后再根据后序遍历的顺序确定左子树和右子树的范围,并递归地进行求解。
具体步骤如下:
1. 根据中序遍历确定根节点的位置,假设根节点在中序遍历中的下标为 rootIndex。
2. 根据后序遍历确定左子树和右子树的范围,假设左子树的节点数为 leftSize,则右子树的节点数为 rightSize = n - leftSize - 1,其中 n 为二叉树的节点数。
3. 递归地求解左子树和右子树的前序遍历,并将根节点加入到结果中,即 preOrder[root] = rootVal。
4. 返回前序遍历。
参考代码如下:
```
class Solution {
public:
vector<int> preorderTraversal(TreeNode* root) {
vector<int> preOrder;
if (!root) return preOrder;
unordered_map<int, int> inorderMap;
buildInorderMap(root, inorderMap);
buildPreorder(root, inorderMap, preOrder);
return preOrder;
}
private:
void buildInorderMap(TreeNode* root, unordered_map<int, int>& inorderMap) {
if (!root) return;
buildInorderMap(root->left, inorderMap);
inorderMap[root->val] = inorderMap.size();
buildInorderMap(root->right, inorderMap);
}
void buildPreorder(TreeNode* root, unordered_map<int, int>& inorderMap, vector<int>& preOrder) {
if (!root) return;
preOrder.push_back(root->val);
int rootIndex = inorderMap[root->val];
int leftSize = rootIndex;
int rightSize = inorderMap.size() - leftSize - 1;
buildPreorder(root->left, inorderMap, preOrder);
buildPreorder(root->right, inorderMap, preOrder);
}
};
```
阅读全文