【劍指offer】問題7:重建二叉樹

問題:輸入某二叉樹的前序遍歷和中序遍歷的結(jié)果,請重建該二叉樹。假設(shè)輸入的前序遍歷和中序遍歷的結(jié)果中都不含重復(fù)的數(shù)字。例如尿赚,輸入前序遍歷序列{1,2,4,7,3,5,6,8}和中序遍歷序列{4,7,2,1,5,3,8,6}。

先上代碼沛婴。

   /**
     * 重建二叉樹
     */
    public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
        return core(pre, in, 0,pre.length - 1, 0, in.length - 1);
    }

    public TreeNode core(int[] pre, int[] in, int preStart, int preEnd, int inStart, int inEnd){
        // 根節(jié)點(前序遍歷的第一個節(jié)點)
        int rootVal = pre[preStart];
        TreeNode root = new TreeNode(rootVal);
        // 找到根節(jié)點在中序遍歷數(shù)組中的位置
        int rootIndexIn = inStart;
        for(;rootIndexIn <= inEnd; rootIndexIn++){
            if(in[rootIndexIn] == rootVal)
                break;
        }
        // 計算左子樹的長度
        int leftLen = rootIndexIn - inStart;
        // 計算右子樹的長度
        int rightLen = inEnd - rootIndexIn;
        if(leftLen > 0){
            // 存在左子樹
            // 找到左子樹的中序遍歷數(shù)組
            int leftInStart = inStart;
            int leftInEnd = leftInStart + leftLen - 1;
            // 找到左子樹的前序遍歷數(shù)組
            int leftPreStart = preStart + 1;
            int leftPreEnd = leftPreStart + leftLen - 1;
            // 構(gòu)建左子樹
            root.left = core(pre,in,leftPreStart, leftPreEnd, leftInStart, leftInEnd);
        }

        if(rightLen > 0){
            // 存在右子樹
            // 找到右子樹的中序遍歷數(shù)組
            int rightInStart = rootIndexIn + 1;
            int rightInEnd = rightInStart + rightLen - 1;

            // 找到右子樹的前序遍歷數(shù)組
            int rightPreStart = preEnd - rightLen + 1;
            int rightPreEnd = preEnd;

            // 構(gòu)建右子樹
            root.right = core(pre, in, rightPreStart, rightPreEnd, rightInStart, rightInEnd);
        }

        return root;
    }

關(guān)于樹的問題很多都可以使用遞歸的方式解決吼畏,只要將一般化的處理過程想清楚督赤,再把返回條件搞好嘁灯,基本就可以。本題已知二叉樹的前序遍歷和中序遍歷結(jié)果躲舌,找出根節(jié)點的值丑婿,然后再根據(jù)這個值找出左子樹和右子樹對應(yīng)的前序和中序遍歷結(jié)果,就可以進行遞歸編程了没卸。此題比較麻煩的子樹數(shù)組的界限問題羹奉,處理好這個問題,遞歸也就不會出錯了约计。
詳細的解題流程在注釋里已經(jīng)比較清楚诀拭,不再贅述。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末煤蚌,一起剝皮案震驚了整個濱河市耕挨,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌尉桩,老刑警劉巖筒占,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蜘犁,居然都是意外死亡翰苫,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來奏窑,“玉大人导披,你說我怎么就攤上這事兼贸∠担” “怎么了旬陡?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵映胁,是天一觀的道長舶替。 經(jīng)常有香客問我说墨,道長俩滥,這世上最難降的妖魔是什么躬它? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任巍实,我火速辦了婚禮滓技,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘棚潦。我一直安慰自己令漂,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布丸边。 她就那樣靜靜地躺著叠必,像睡著了一般。 火紅的嫁衣襯著肌膚如雪妹窖。 梳的紋絲不亂的頭發(fā)上纬朝,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天,我揣著相機與錄音骄呼,去河邊找鬼共苛。 笑死,一個胖子當(dāng)著我的面吹牛蜓萄,可吹牛的內(nèi)容都是我干的隅茎。 我是一名探鬼主播,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼嫉沽,長吁一口氣:“原來是場噩夢啊……” “哼辟犀!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起绸硕,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤堂竟,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后臣咖,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體跃捣,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年夺蛇,在試婚紗的時候發(fā)現(xiàn)自己被綠了疚漆。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖娶聘,靈堂內(nèi)的尸體忽然破棺而出闻镶,到底是詐尸還是另有隱情,我是刑警寧澤丸升,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布铆农,位于F島的核電站,受9級特大地震影響狡耻,放射性物質(zhì)發(fā)生泄漏墩剖。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一夷狰、第九天 我趴在偏房一處隱蔽的房頂上張望岭皂。 院中可真熱鬧,春花似錦沼头、人聲如沸爷绘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽土至。三九已至,卻和暖如春猾昆,著一層夾襖步出監(jiān)牢的瞬間陶因,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工毡庆, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留坑赡,地道東北人。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓么抗,卻偏偏與公主長得像,于是被迫代替她去往敵國和親亚铁。 傳聞我的和親對象是個殘疾皇子蝇刀,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,033評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 給定一個前序和中序變量的結(jié)果,寫一個算法重建這棵樹:前序: a b d c e f中序: d b a e c f...
    HangChen閱讀 538評論 0 3
  • 樹 記錄《劍指offer》中所有關(guān)于樹的題目徘溢,以及LeetCode中的相似題目吞琐。 相關(guān)題目列表 題目 樹是一種最常...
    wenmingxing閱讀 1,418評論 2 13
  • 面試題7:重建二叉樹 題目: 輸入某二叉樹的前序遍歷和中序遍歷的結(jié)果。請重建該二叉樹然爆。假設(shè)輸入的前序遍歷和中序遍歷...
    lyoungzzz閱讀 569評論 0 0
  • 本文是我自己在秋招復(fù)習(xí)時的讀書筆記站粟,整理的知識點,也是為了防止忘記曾雕,尊重勞動成果奴烙,轉(zhuǎn)載注明出處哦!如果你也喜歡,那...
    波波波先森閱讀 4,105評論 0 23
  • 將平凡變?yōu)榉欠驳氖牵?書籍:《活法》 作者:稻盛和夫 才子自恃才高切诀,容易忽視“今天”揩环,往往會在意想不到的地方駐足不...
    大頭的故事閱讀 136評論 2 0