7.重建二叉樹

給一個二叉樹前序遍歷和中序遍歷的結(jié)果,請重建這顆二叉樹。例如前序遍歷結(jié)果為:
{1,2,4,7,3,5,6,8},中序遍歷結(jié)果為{4,7,2,1,5,3,8,6}。

算法思路:由于前序遍歷的第一個一定是根節(jié)點,故可以從前序遍歷結(jié)果中確定一個根節(jié)點,所以此二叉樹的根節(jié)點是1。根據(jù)中序遍歷先訪問左節(jié)點,再訪問根節(jié)點,最后訪問右節(jié)點的特點,根節(jié)點一定是在左節(jié)點和右節(jié)點之間,故可以在中序遍歷中找到根節(jié)點,將剩下的分割為左邊節(jié)點部分和右邊節(jié)點部分,比如在上述中序遍歷中找到1后,可以將{4,7,2}作為1的左節(jié)點部分,{5,3,8,6}作為1的右節(jié)點部分。確定好這兩部分的長度后,再將先序遍歷結(jié)果分割為兩部分,一部分是{2,4,7},另一部分是{3,5,6,8},再分別對分割后的序列{2,4,7}和{4,7,2},{3,5,6,8}和{5,3,8,6}重復(fù)上述操作(遞歸)。

由題干得,函數(shù)傳入的參數(shù)應(yīng)為前序遍歷結(jié)果和中序遍歷結(jié)果,還應(yīng)該有個序列長度,來確定起始位置。

BinaryTreeNode* Construct(int* preorder,int* inorder,int length)
{
    if(preorder == nullptr || inorder == nullptr || length <= 0)
        return;
    else
        return ConstructCore(preorder,preorder + length -1,inorder,inorder + length -1);
}

BinaryTreeNode* ConstructCore(int* startPreorder,int* endPreorder,int* startInorder,int* endInorder)
{
    int rootvalue = startPreorder[0];
    BinaryTreeNode* pNew = new BinaryTreeNode();
    pNew -> m_nvalue = rootvalue;
    pNew -> m_pLeft = pNew -> m_pRright = nullptr;

    if(startPreorder == endPreorder)
    {
        if(startInorder = endInorder && *startPreorder = *startInorder)
        {
            return root;
        }   
        else
        {
            throw std::exception("Invalid input");
        }
    }

    int* rootInorder = startInorder;
    while(rootInorder != rootvalue && rootInorder <= endInorder)
        rootInorder++;
    if(rootInorder == endInorder && *rootInorder != rootvalue)
        throw std::exception("Invalid input")
    //確定分割長度
    int left_length = rootInorder - startInorder; 
    int* leftPreorderEnd = startPreorder + left_length; //確定先序遍歷中分割的部分
    if(left_length > 0)
    {
        root -> m_pLeft = ConstructCore(startPreorder+1,leftPreorderEnd,startInorder,rootInorder-1);
    }

    if(left_length < endPreorder - startPreorder)
    {
        root -> m_pRright = ConstructCore(leftPreorderEnd+1,endPreorder,rootInorder+1,endInorder);
    }
    return root;
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 題目描述 輸入某二叉樹的前序遍歷和中序遍歷的結(jié)果,請重建出該二叉樹。假設(shè)輸入的前序遍歷和中序遍歷的結(jié)果中都不含重復(fù)...
    凌霄文強(qiáng)閱讀 222評論 0 2
  • 題目描述: 輸入某二叉樹的前序遍歷和中序遍歷的結(jié)果,請重新構(gòu)造出該二叉樹。假設(shè)輸入的前序遍歷和中序遍歷的結(jié)果中不包...
    淺淺星空閱讀 128評論 0 1
  • 【題目描述】輸入某二叉樹的前序遍歷和中序遍歷的結(jié)果,請重建出該二叉樹。假設(shè)輸入的前序遍歷和中序遍歷的結(jié)果中都不含重...
    fighting_css閱讀 179評論 0 0
  • 題目描述: 輸入某二叉樹的前序遍歷和中序遍歷的結(jié)果,請重建出該二叉樹。假設(shè)輸入的前序遍歷和中序遍歷的結(jié)果中都不含重...
    小歪與大白兔閱讀 188評論 0 0
  • 元宵節(jié)是我國古代傳統(tǒng)節(jié)日,象征著團(tuán)團(tuán)圓圓。最讓我回味無窮的乃是那香甜的小湯圓了。起初,當(dāng)人們看到那雪球般的...
    守望幸福_b3e6閱讀 255評論 0 0

友情鏈接更多精彩內(nèi)容