重建二叉树

/*
    重建二叉树
    pre  1,2,4,7,3,5,6,8
    in   4,7,2,1,5,3,8,6
*/

struct BinTree
{
    int m_nValue;
    BinTree* m_pLeft;
    BinTree* m_pRight;
    BinTree(int x) :
        m_nValue(x), m_pLeft(NULL), m_pRight(NULL)
    {}
    BinTree(int x,BinTree* l,BinTree* r) :
        m_nValue(x), m_pLeft(l), m_pRight(r)
    {}
};

BinTree* ConstructCore(int* startpre, int *endpre, int* startin, int* endin)
{
    int rootvalue = startpre[0];
    BinTree* root = new BinTree(rootvalue);

    if (startpre == endpre)
    {
        if (startin == endin && *startpre == *startin)
            return root;
        else
            throw std::exception("invalid input");
    }

    int *rootIn = startin;
    while (rootIn <= endin && *rootIn != rootvalue)
        ++rootIn;

    if (rootIn == endin && *rootIn != rootvalue)
        throw std::exception("invalid input");

    int LeftLength = rootIn - startin;
    int* LeftPreorderEnd = startpre + LeftLength;

    if (LeftLength > 0)
    {
        root->m_pLeft = ConstructCore(startpre + 1, LeftPreorderEnd, startin, rootIn - 1);
    }
    if (LeftLength < endpre - startpre)
    {
        root->m_pRight = ConstructCore(LeftPreorderEnd + 1, endpre, rootIn + 1, endin);
    }
    return root;
}

BinTree* Construct(int* pre, int* in, int length)
{
    if (pre == NULL || in == NULL || length <= 0)
        return NULL;

    return ConstructCore(pre, pre + length - 1, in, in + length - 1);
}

//void test()
//{
//  int pre[8] = { 1,2,4,7,3,5,6,8 };
//  int in[8] = { 4,7,2,1,5,3,8,6 };
//
//  BinTree* root = Construct(pre, in, 8);
//  getchar();
//}
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值