Leetcode 105. 從前序與中序遍歷序列構(gòu)造二叉樹(分治算法)

問題描述

根據(jù)一棵樹的前序遍歷與中序遍歷構(gòu)造二叉樹。
注意:
你可以假設(shè)樹中沒有重復(fù)的元素。

Example

輸入:前序遍歷 preorder = [3,9,20,15,7]
   中序遍歷 inorder = [9,3,15,20,7]

返回如下的二叉樹:

題目鏈接:105. 從前序與中序遍歷序列構(gòu)造二叉樹 (難度:中等)

思路

樹的先序遍歷順序?yàn)?NLR,中序遍歷順序?yàn)?LNR。因此,我們可以采用分治的思想,以先序序列 preorder 中的 preorder[0] 為樹的根節(jié)點(diǎn) root,然后通過 root 我們可以中序序列劃分為左右兩棵子樹,分別對(duì)左右兩棵子樹遞歸處理,即可完成建樹,如下圖所示


選擇根節(jié)點(diǎn),并劃分左右子樹

處理右子樹

代碼

class Solution {
public:
    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
        return buildTree(preorder,0,preorder.size()-1,inorder,0,inorder.size()-1);
    }
    // l_pre 和 r_pre 代表當(dāng)前子樹在 preorder 中的左右邊界
    // l_in 和 r_in 代表當(dāng)前子樹在 inorder 中的左右邊界
    TreeNode* buildTree(vector<int>& preorder, int l_pre,int r_pre,vector<int>& inorder,int l_in,int r_in) {
        if(l_pre > r_pre || l_in > r_in)
            return NULL;
        TreeNode* root = new TreeNode(preorder[l_pre]);
        int pos = l_in;
        while(inorder[pos] != preorder[l_pre]){
            pos++;
        }
        root->left = buildTree(preorder, l_pre + 1, l_pre + pos - l_in, inorder, l_in, pos - 1);
        root->right = buildTree(preorder, pos - l_in + l_pre + 1, r_pre, inorder, pos + 1, r_in);
        return root;
    }
};

相關(guān)練習(xí):1008. 先序遍歷構(gòu)造二叉樹 (難度:中等)

相關(guān)文章:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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