给你前序中序遍历输出后续遍历代码C++代码
时间: 2024-12-02 19:19:42 浏览: 5
前序遍历中序遍历、中序后续便利还原二叉树
在C++中,如果你有二叉树的前序遍历(Preorder)和中序遍历(Inorder),你可以利用它们推导出后序遍历(Postorder)。因为前序遍历的第一个元素通常是根节点,而中序遍历可以帮助我们找到左子树和右子树。下面是一个简单的步骤:
1. 后序遍历的顺序通常是先左子树、再右子树、最后根节点。
2. 首先,我们需要找到根节点,这在前序遍历中是第一个元素。
3. 然后,在中序遍历中找到这个根节点的位置,它可以分为左子序列和右子序列。
以下是C++代码实现:
```cpp
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
vector<int> recoverPostorder(TreeNode* root, vector<int>& preOrder, vector<int>& inOrder) {
unordered_map<int, int> idxMap; // 中序索引映射
for (int i = 0; i < inOrder.size(); ++i)
idxMap[inOrder[i]] = i;
stack<TreeNode*> s;
for (int num : preOrder) { // 遍历前序
if (!s.empty() && s.top()->val == num) {
// 找到当前节点,从后序开始记录
vector<int> result;
while (s.top()->val != root->val) {
result.push_back(s.top()->val);
s.pop();
}
reverse(result.begin(), result.end()); // 反转得到后序
for (int i = 0; i < result.size(); ++i)
inOrder[idxMap[result[i]]] = result[i]; // 更新中序
break;
}
s.push(new TreeNode(num));
}
return inOrder;
}
```
这里假设`preOrder`是前序遍历数组,`inOrder`是中序遍历数组,返回的是处理后的后序遍历结果。注意,这段代码只适用于非空的二叉搜索树,且`preOrder`中必定包含了根节点。
阅读全文