用C++实现二叉树的先序中序推后序
时间: 2023-08-31 18:05:54 浏览: 164
二叉树的基本运算
好的,下面是用C++实现二叉树的先序中序推后序的代码:
```cpp
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
vector<int> buildTree(vector<int>& preorder, vector<int>& inorder) {
vector<int> postorder;
if(preorder.empty() || inorder.empty()) {
return postorder;
}
int rootValue = preorder[0];
int inorderIndex = find(inorder.begin(), inorder.end(), rootValue) - inorder.begin();
vector<int> leftPreorder(preorder.begin()+1, preorder.begin()+inorderIndex+1);
vector<int> leftInorder(inorder.begin(), inorder.begin()+inorderIndex);
vector<int> rightPreorder(preorder.begin()+inorderIndex+1, preorder.end());
vector<int> rightInorder(inorder.begin()+inorderIndex+1, inorder.end());
vector<int> leftPostorder = buildTree(leftPreorder, leftInorder);
vector<int> rightPostorder = buildTree(rightPreorder, rightInorder);
postorder.insert(postorder.end(), leftPostorder.begin(), leftPostorder.end());
postorder.insert(postorder.end(), rightPostorder.begin(), rightPostorder.end());
postorder.push_back(rootValue);
return postorder;
}
int main() {
vector<int> preorder = {1, 2, 4, 5, 3, 6};
vector<int> inorder = {4, 2, 5, 1, 3, 6};
vector<int> postorder = buildTree(preorder, inorder);
for(int i=0; i<postorder.size(); i++) {
cout << postorder[i] << " ";
}
cout << endl;
return 0;
}
```
在这个程序中,我们首先判断先序遍历和中序遍历是否为空,如果为空,则返回空的后序遍历结果。如果不为空,我们取出先序遍历的第一个元素,即为根节点的值。然后在中序遍历中查找根节点的位置,可以使用STL中的find函数来实现。接着,我们将先序遍历和中序遍历分别划分为左子树的先序遍历和中序遍历,以及右子树的先序遍历和中序遍历。然后,分别递归处理左子树和右子树,并将其得到的后序遍历结果添加到最终的后序遍历结果中。最后,将根节点的值添加到后序遍历结果的末尾,并返回后序遍历结果。
希望这个回答对你有帮助!
阅读全文