跳转至

一本通-1340:【例3-5】扩展二叉树

【题目描述】

由于先序、中序和后序序列中的任一个都不能唯一确定一棵二叉树,所以对二叉树做如下处理,将二叉树的空结点用·补齐,如图所示。我们把这样处理后的二叉树称为原二叉树的扩展二叉树,扩展二叉树的先序和后序序列能唯一确定其二叉树。

img

现给出扩展二叉树的先序序列,要求输出其中序和后序序列。

【输入】

扩展二叉树的先序序列。

【输出】

输出其中序和后序序列。

【输入样例】

ABD..EF..G..C..

【输出样例】

DBFEGAC DFGEBCA


#include <bits/stdc++.h>

using namespace std;

class Tree
{
    struct TreeNode {
        char ch;
        TreeNode *left, *right;
        TreeNode(char x): ch(x), left(NULL), right(NULL) {}
    };
    TreeNode *root;
    int pos;

    void build(const string & s, TreeNode *& root)
    {
        if (s[++pos] != '.') {
            root = new TreeNode(s[pos]);
            build(s, root -> left);
            build(s, root -> right);
        }
        else root = NULL;
    }

    void inorderTraversal(TreeNode *root)
    {
        if (root) {
            inorderTraversal(root -> left);
            cout << root -> ch;
            inorderTraversal(root -> right);
        }
    }

    void postorderTraversal(TreeNode *root)
    {
        if (root) {
            postorderTraversal(root -> left);
            postorderTraversal(root -> right);
            cout << root -> ch;
        }
    }

    void makeEmpty(TreeNode *& root)
    {
        if (root) {
            makeEmpty(root -> left);
            makeEmpty(root -> right);
            delete root;
            root = NULL;
        }
    }

public:
    Tree(): root(NULL), pos(-1) {}

    ~Tree() { makeEmpty(root); }

    void build(const string & s){ build(s, root); }

    void inorderTraversal() { inorderTraversal(root); }

    void postorderTraversal() { postorderTraversal(root); }
};


int main()
{
    std::ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    string s;
    cin >> s;
    Tree obj;
    obj.build(s);

    obj.inorderTraversal();
    cout << endl;
    obj.postorderTraversal();
    cout << endl;

    return 0;
}