溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

C++實(shí)現(xiàn)重建二叉樹

發(fā)布時(shí)間:2020-06-10 16:05:01 來源:億速云 閱讀:556 作者:元一 欄目:編程語言

二叉樹

在計(jì)算機(jī)科學(xué)中,二叉樹是每個(gè)結(jié)點(diǎn)最多有兩個(gè)子樹的樹結(jié)構(gòu)。通常子樹被稱作“左子樹”(left subtree)和“右子樹”(right subtree)。二叉樹常被用于實(shí)現(xiàn)二叉查找樹和二叉堆。 

一棵深度為k,且有2^k-1個(gè)結(jié)點(diǎn)的二叉樹,稱為滿二叉樹。這種樹的特點(diǎn)是每一層上的結(jié)點(diǎn)數(shù)都是最大結(jié)點(diǎn)數(shù)。而在一棵二叉樹中,除最后一層外,若其余層都是滿的,并且或者最后一層是滿的,或者是在右邊缺少連續(xù)若干結(jié)點(diǎn),則此二叉樹為完全二叉樹。具有n個(gè)結(jié)點(diǎn)的完全二叉樹的深度為floor(log2n)+1。深度為k的完全二叉樹,至少有2k-1個(gè)葉子結(jié)點(diǎn),至多有2k-1個(gè)結(jié)點(diǎn)。

題目描述

輸入某二叉樹的前序遍歷和中序遍歷的結(jié)果,請(qǐng)重建出該二叉樹。假設(shè)輸入的前序遍歷和中序遍歷的結(jié)果中都不含重復(fù)的數(shù)字。例如輸入前序遍歷序列{1,2,4,7,3,5,6,8}和中序遍歷序列{4,7,2,1,5,3,8,6},則重建二叉樹并返回。

二叉樹結(jié)點(diǎn)數(shù)據(jù)結(jié)構(gòu)規(guī)定如下:

 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };

本題主要采用遞歸思想,解法如下:

    TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin)
    {
        vector<int> pre_lchild, pre_rchild, vin_lchild, vin_rchild;
        int i;
        int size = pre.size();
        if(size == 0)
            return NULL;
        TreeNode* root = new TreeNode(pre[0]);
        for(i = 0; vin[i] != pre[0]; ++i);
        pre_lchild = vector<int>(pre.begin()+1, pre.begin()+i+1);
        vin_lchild = vector<int>(vin.begin(), vin.begin()+i);
        pre_rchild = vector<int>(pre.begin()+i+1, pre.end());
        vin_rchild = vector<int>(vin.begin()+i+1, vin.end());
        root->left = reConstructBinaryTree(pre_lchild, vin_lchild);
        root->right = reConstructBinaryTree(pre_rchild, vin_rchild);
        return root;
    }

時(shí)間復(fù)雜度為O(nlogn),空間復(fù)雜度為O(n^2)。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI