UVa536
根据二叉树的前序和中序遍历求出后续遍历。
#include <iostream>
#include <string>
using namespace std;
class Solution
{
public:
Solution(const string &preorder, const string &inorder)
: preorder(preorder), inorder(inorder)
{
size_t curr = 0;
size_t root = inorder.find(preorder[curr++]);
RecoverPostorder(0, root, curr);
RecoverPostorder(root + 1, inorder.length(), curr);
postorder.push_back(inorder[root]);
}
string result()
{
return postorder;
}
private:
string preorder, inorder, postorder;
void RecoverPostorder(size_t start, size_t end, size_t &curr)
{
if (start == end) return;
size_t root = inorder.find(preorder[curr++]);
RecoverPostorder(start, root, curr);
RecoverPostorder(root + 1, end, curr);
postorder.push_back(inorder[root]);
}
};
int main()
{
string preorder, inorder;
while (cin >> preorder >> inorder) {
Solution solution(preorder, inorder);
cout << solution.result() << endl;
}
return 0;
}
/*
DBACEGF ABCDEFG
BCAD CBAD
*/
该程序实现了根据给定的二叉树前序和中序遍历,计算并输出其后序遍历的方法。通过递归地查找根节点,将二叉树分为左右子树,进而分别恢复后序遍历。最后将结果存储到字符串`postorder`中并返回。

被折叠的 条评论
为什么被折叠?



