先序、中序、后序数组两两结合重构二叉树

#include "Tree.h"
using namespace std;
//先序加中序
Node* preIN(int* p, int pi, int pj, int* n, int ni, int nj,
            map<int, int>& nMap)
{
    if(pi > pj)
        return nullptr;
    Node* head = new Node(p[pi]);
    int index = nMap[p[pi]];
    head->left = preIN(p, pi + 1, pi + index - ni, n, ni, index - 1, nMap);
    head->right = preIN(p, pi + index - ni + 1, pj, n, index + 1, nj, nMap);
}
Node* preInToTree(int* pre, int* in, int length)
{
    if(pre == nullptr || in == nullptr || length < 1)
        return nullptr;
    map<int, int> nMap;
    for(int i = 0; i < length; ++i)
        nMap[in[i]] = i;
    return preIN(pre, 0, length - 1, in, 0, length - 1, nMap);
}
//后序加中序
Node* inPos(int* n, int ni, int nj,
            int* s, int si, int sj,
            map<int, int>& nMap)
            {
                if(si > sj)
                    return nullptr;
                Node* head = new Node(s[sj]);
                int index = nMap[s[sj]];
                head->left = inPos(n, ni, index - 1, s, si, si + index - ni - 1, nMap);
                head->right = inPos(n, index + 1, nj, s, si + index - ni, sj - 1, nMap);
            }
Node* inPosToTree(int* in, int* pos, int length)
{
    if(in == nullptr || pos == nullptr || length < 1)
        return nullptr;
    map<int, int> nMap;
    for(int i = 0; i < length; ++i)
        nMap[in[i]] = i;
    return inPos(in, 0, length - 1, pos, 0, length - 1, nMap);
}
//前序加后序
//并非所有的树都可以通过先序和后序数组的组合重建出来
//必须所有节点要么是叶子节点,要么左右子树都存在
Node* prePos(int* p, int pi, int pj,
             int* s, int si, int sj,
             map<int, int>& nMap)
             {
                 Node* head = new Node(s[sj--]);
                 if(pi == pj)
                    return head;
                 int index = nMap[p[++pi]];
                 head->left = prePos(p, pi, pi + index - si, s, si, index, nMap);
                 head->right = prePos(p, pi + index - si + 1, pj, s, index + 1, sj, nMap);
                 return head;
             }
Node* prePosToTree(int* pre, int* pos, int length)
{
    if(pre == nullptr || pos == nullptr || length < 0)
        return nullptr;
    map<int, int> nMap;
    for(int i = 0; i < length; ++i)
        nMap[pos[i]] = i;
    return prePos(pre, 0, length - 1, pos, 0, length - 1, nMap);
}

int main()
{
    int pre[] = {0, 1, 3, 4, 2, 5, 6};
    int in[]  = {3, 1, 4, 0, 5, 2, 6};
    int pos[] = {3, 4, 1, 5, 6, 2, 0};

    Node* pNode0 = preInToTree(pre, in, 7);
    Node* pNode1 = inPosToTree(in, pos, 7);
    Node* pNode2 = prePosToTree(pre, pos, 7);

    Print(pNode0);
    cout << "=================================" << endl;
    Print(pNode1);
    cout << "=================================" << endl;
    Print(pNode2);
    cout << "=================================" << endl;
}

猜你喜欢

转载自blog.csdn.net/wzc2608/article/details/80877031
今日推荐