重構二叉樹

輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹痛阻。假設輸入的前序遍歷和中序遍歷的結果中都不含重復的數(shù)字菌瘪。例如輸入前序遍歷序列{1,2,4,7,3,5,6,8}和中序遍歷序列{4,7,2,1,5,3,8,6},則重建二叉樹并返回阱当。


第一次看到這個題目感覺:這種題還能編程寫出來俏扩,這不是某些面試的題目嗎,根據(jù)指定的二叉樹遍歷順序(前中弊添,后中)確定二叉樹的結構录淡。讓自己在紙上自己看看還行,編程怎么寫呢油坝,在紙上畫了畫嫉戚,首先沒有想到遞歸的方式,本想通過兩個for循環(huán)澈圈,外面的循環(huán)是前序數(shù)組彬檀,里面的是中序,前序確定根節(jié)點比較容易瞬女,比如1是樹的根節(jié)點窍帝,那2是根的左子樹還是右子樹呢,僅僅根據(jù)前序是無法判斷的诽偷,這時候要根據(jù)中序坤学,2在1的左邊,所以2是1的左子樹根節(jié)點报慕,但是始終沒有考慮好一個完整的步驟深浮。后來開始想到了遞歸,因為樹就是一個遞歸結構卖子。

首先可以判定1是根節(jié)點所以可以將上述的兩個序列分成4部分:

前序:[2,4,7]和[3,5,6,8]

中序: [4,7,2]和[5,3,8,6]
然后右 [2,4,7]和[4,7,2]構建新的樹作為根節(jié)點的左子樹略号,因為這些點在中序中位于1的左邊刑峡。同理[3,5,6,8]和[5,3,8,6]構建根節(jié)點的右子樹洋闽。
可以很容易看到除了數(shù)組范圍變小了,其他的求解過程依舊沒有變突梦,前序的第一個元素的依然是構建的樹的根節(jié)點诫舅。其他分割策略完全相同。

為了方便本地測試宫患,代碼使用了swift(題目在線測評網(wǎng)站上沒有提供swift語言解題的功能刊懈,但是這個算法和語言是無關的)。

class TreeNode {
    
    var val:Int!
    var left:TreeNode?
    var right:TreeNode?
    
    init(val:Int) {
        self.val = val
    }
}

func reConstruct(pre:[Int],vin:[Int]) -> TreeNode? {
    
    //為0表示樹是空的
    if pre.count==0&&vin.count==0 {
        return nil
    }
    //根節(jié)點在中序的位置
    let r_idx = vin.index(of: pre[0]);
    //前序的第一個就是樹的根節(jié)點
    let root = TreeNode(val: pre[0]);
    var sub_left_pre = [Int]()
    var sub_right_pre = [Int]()
    for val in pre {
        //前序中位于根節(jié)點之前的中序的值,作為根節(jié)點的左子樹的前序序列虚汛,否則作為右子樹的前序序列
        if vin.index(of: val)! < r_idx! {
            sub_left_pre.append(val)
        }
        else if  vin.index(of: val)! > r_idx!{
            sub_right_pre.append(val)
        }
    }
    var sub_left_in = [Int]()
    var sub_right_in = [Int]()
    for (i,val) in vin.enumerated() {
        //中序里面匾浪,根節(jié)點之前的元素序列作為左子樹的中序序列,之后的作為右子樹序列
        if i < r_idx! {
            sub_left_in.append(val)
        }
        else if i > r_idx! {
            sub_right_in.append(val)
        }
    }
    print(pre);
    print(vin);
    //遞歸調(diào)用下
    root.left = reConstruct(pre: sub_left_pre , vin: sub_left_in)
    root.right = reConstruct(pre: sub_right_pre, vin: sub_right_in)
    return root;
}

var a = [1,2,4,7,3,5,6,8]
var b = [4,7,2,1,5,3,8,6]

func pre_print(root:TreeNode?) -> Void {
    
    if root == nil {
        return;
    }else{
        print("\(root!.val!) ",terminator:"")

        pre_print(root: root!.left);
        pre_print(root: root!.right)
    }
}

func in_print(root:TreeNode?) -> Void {
    
    if root == nil {
        return;
    }else{
        in_print(root: root!.left)
        print("\(root!.val!) ",terminator:"")
        in_print(root: root!.right)

    }
}

var root = reConstruct(pre: a, vin: b);

pre_print(root: root);
print("\n")
in_print(root: root);
Paste_Image.png

可以看到上面函數(shù)執(zhí)行的遞歸過程是正確的卷哩,并且根據(jù)構建出的樹的根節(jié)點進行前序和中序打印和輸入是一樣的蛋辈。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市将谊,隨后出現(xiàn)的幾起案子冷溶,更是在濱河造成了極大的恐慌,老刑警劉巖尊浓,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件逞频,死亡現(xiàn)場離奇詭異,居然都是意外死亡栋齿,警方通過查閱死者的電腦和手機苗胀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瓦堵,“玉大人柒巫,你說我怎么就攤上這事」韧瑁” “怎么了堡掏?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵祭饭,是天一觀的道長岂却。 經(jīng)常有香客問我,道長吴趴,這世上最難降的妖魔是什么揩慕? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任亭畜,我火速辦了婚禮,結果婚禮上迎卤,老公的妹妹穿的比我還像新娘拴鸵。我一直安慰自己,他們只是感情好蜗搔,可當我...
    茶點故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布劲藐。 她就那樣靜靜地躺著,像睡著了一般樟凄。 火紅的嫁衣襯著肌膚如雪聘芜。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天缝龄,我揣著相機與錄音汰现,去河邊找鬼挂谍。 笑死,一個胖子當著我的面吹牛瞎饲,可吹牛的內(nèi)容都是我干的口叙。 我是一名探鬼主播,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼嗅战,長吁一口氣:“原來是場噩夢啊……” “哼庐扫!你這毒婦竟也來了?” 一聲冷哼從身側響起仗哨,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤形庭,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后厌漂,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體萨醒,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年苇倡,在試婚紗的時候發(fā)現(xiàn)自己被綠了富纸。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡旨椒,死狀恐怖晓褪,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情综慎,我是刑警寧澤涣仿,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站示惊,受9級特大地震影響好港,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜米罚,卻給世界環(huán)境...
    茶點故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一钧汹、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧录择,春花似錦拔莱、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至货裹,卻和暖如春嗤形,著一層夾襖步出監(jiān)牢的瞬間精偿,已是汗流浹背弧圆。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工赋兵, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人搔预。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓霹期,卻偏偏與公主長得像,于是被迫代替她去往敵國和親拯田。 傳聞我的和親對象是個殘疾皇子历造,可洞房花燭夜當晚...
    茶點故事閱讀 45,675評論 2 359

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

  • 樹的概述 樹是一種非常常用的數(shù)據(jù)結構,樹與前面介紹的線性表船庇,棧吭产,隊列等線性結構不同,樹是一種非線性結構 1.樹的定...
    Jack921閱讀 4,462評論 1 31
  • 輸入某二叉樹的前序遍歷和中序遍歷的結果鸭轮,請重建出該二叉樹臣淤。假設輸入的前序遍歷和中序遍歷的結果中都不含重復的數(shù)字。例...
    克里斯加德納閱讀 673評論 0 50
  • 基于樹實現(xiàn)的數(shù)據(jù)結構窃爷,具有兩個核心特征: 邏輯結構:數(shù)據(jù)元素之間具有層次關系邑蒋; 數(shù)據(jù)運算:操作方法具有Log級的平...
    yhthu閱讀 4,282評論 1 5
  • 原文鏈接:http://blog.csdn.net/qq_22329521/article/details/529...
    越長越圓閱讀 383評論 0 0
  • 鷓鴣天·游雪野 文/雪中萍 雪野同游一整天,親人朋友共心歡按厘。 疑驚不慎歸仙境医吊,原來就是在人間。 白皚皚逮京,湛天...
    雪中萍閱讀 541評論 0 0