二叉樹的前序遍歷之Morris

之前我們介紹了二叉樹前序排序的兩種方法绽榛,一種是遞歸北发,一種是迭代井赌。這兩種沒有什么大的差別闸翅。今天我們帶來了一種Morris遍歷

Morris 遍歷的核心思想是利用樹的大量空閑指針,實(shí)現(xiàn)空間開銷的極限縮減

其前序遍歷規(guī)則總結(jié)如下:

1辜伟, 新建臨時(shí)樹氓侧,令該節(jié)點(diǎn)為樹的根;

2导狡,如果當(dāng)前根的左子樹為空约巷,將當(dāng)前根放入數(shù)組,并將當(dāng)前根的右子樹更新為樹的根烘豌;

3载庭, 如果當(dāng)前根的左子樹不為空看彼,獲取到當(dāng)前根的左子樹:

3.1廊佩, 循環(huán)遍歷當(dāng)前根的左子樹的所有右子樹,獲取到最后一個(gè)不等于根的右子樹

3.1靖榕, 如果獲取到的右子樹為空标锄,將根節(jié)點(diǎn)放入數(shù)組,然后將根賦值給遍歷獲取到的右子樹的右子樹茁计。

3.2料皇, 如果獲取到的右子樹不為空,將獲取到的右子樹的右子樹刪除星压,同時(shí)將根的右子樹更新為樹的根

重復(fù)步驟 2 和步驟 3践剂,直到遍歷結(jié)束。

看到這里如果有一點(diǎn)點(diǎn)懵的話就看一下下面的圖娜膘,我會(huì)一步一步的將實(shí)現(xiàn)過程給畫出來逊脯。

第一步,我們獲取到樹的根F竣贪,然后獲取F的左子樹军洼,如果左子樹為空巩螃,我們就將F放入數(shù)組,然后獲取樹的右子樹更新為樹的根匕争。

這里左子樹不為空避乏,我們第一步拿到樹的左子樹B,然后遍歷B的所有右子樹甘桑,一直遍歷到右子樹為空并且右子樹不等于當(dāng)前根的情況拍皮,這里我們B本來就沒有右子樹,所以直接拿到B跑杭。

當(dāng)B的右子樹為空春缕,我們將F放入數(shù)組。然后將F放入B的右子樹艘蹋。

根節(jié)點(diǎn)指向B

image

第二步锄贼,我們獲取到樹的根 B,判斷B的左子樹女阀,如果左子樹為空宅荤,我們將就將B 放入數(shù)組,同時(shí)將根指向 F

image

第三步浸策,我們獲取到樹的根F冯键,判斷F的左子樹是否為空,這里樹的左子樹不為空庸汗,所以拿到樹的左子樹B 惫确,然后遍歷B的所有右子樹,一直遍歷到右子樹為空并且右子樹不等于根的情況蚯舱。

這里B的右子樹是等于根的改化,所以走恢復(fù)二叉樹的邏輯,將B的右子樹 清空枉昏,同時(shí)將根指向根的右子樹 A

image

第四步陈肛,我們獲取到樹的根A,判斷A的左子樹是否為空兄裂,這里樹的左子樹不為空句旱,所以拿到樹的左子樹D,然后遍歷D的所有右子樹晰奖,一直遍歷到右子樹為空并且右子樹不等于當(dāng)前根的情況谈撒,這里我們的D本來就沒有右子樹,所以直接拿到D 匾南,因?yàn)镈的右子樹為空啃匿,那么我們將根A放入到數(shù)組,將根A放入到D的右子樹。根節(jié)點(diǎn)指向D

image

第五步午衰,我們獲取到樹的根D立宜,判斷D的左子樹冒萄,如果D的左子樹為空,那么將D放入數(shù)組橙数,同時(shí)將根指向A

image

第六步尊流,我們獲取到樹的根A,判斷A的左子樹是否為空灯帮,這里A的左子樹是不為空的崖技,所以拿到A的左子樹D,然后遍歷D的所有右子樹钟哥,一直到右子樹為空并且右子樹不等于根迎献,這里D的右子樹等于根,我們走恢復(fù)二叉樹邏輯腻贰,將D的右子樹A刪除吁恍,然后將根指向A的右子樹C

image

第七步,我們獲取到樹的根C播演,判斷C的左子樹是否為空冀瓦,這里C的左子樹為空,那么將C放入數(shù)組写烤,同時(shí)將根指向C的右子樹翼闽,C的右子樹為空遍歷結(jié)束

image

經(jīng)過我們一步一步的拆解,是不是已經(jīng)感覺這個(gè)排序也超級(jí)簡單呢洲炊,現(xiàn)在上代碼


public static void main(String[] args) {

    Solution solution = new Solution();

    TreeNode t = new TreeNode("F", new TreeNode("B",null,null), new TreeNode("A", new TreeNode("D",null,null), new TreeNode("C",null,null)));

    System.out.println(Morris_PreOrder(t));

}

public static List<String> Morris_PreOrder(TreeNode root) {

    List res = new ArrayList<>();

    if(root == null){

        return res;

    }

    TreeNode cur = root;

    while(cur != null) {

        if(cur.left == null) {

            res.add(cur.val);

            cur = cur.right;

        } else {

            TreeNode tmp = cur.left;

            while(tmp.right != null && tmp.right != cur){

                tmp = tmp.right;

            }

            if(tmp.right == null) {

                res.add(cur.val); //輸出當(dāng)前節(jié)點(diǎn)

                tmp.right = cur; //將當(dāng)前根節(jié)點(diǎn)賦值給 最右子樹的右子樹

                cur = cur.left;

            } else {

                tmp.right = null; //恢復(fù)二叉樹

                cur = cur.right;

            }

        }

    }

    return res;

}   

是春風(fēng)感局, 是余暉, 是一道曙光暂衡, 是未來可期询微。

手敲不易,點(diǎn)個(gè)贊唄

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末古徒,一起剝皮案震驚了整個(gè)濱河市拓提,隨后出現(xiàn)的幾起案子读恃,更是在濱河造成了極大的恐慌隧膘,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,204評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件寺惫,死亡現(xiàn)場(chǎng)離奇詭異疹吃,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)西雀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門萨驶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人艇肴,你說我怎么就攤上這事腔呜∪拢” “怎么了测摔?”我有些...
    開封第一講書人閱讀 164,548評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵丘喻,是天一觀的道長。 經(jīng)常有香客問我策泣,道長谤草,這世上最難降的妖魔是什么跟束? 我笑而不...
    開封第一講書人閱讀 58,657評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮丑孩,結(jié)果婚禮上冀宴,老公的妹妹穿的比我還像新娘。我一直安慰自己温学,他們只是感情好略贮,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著仗岖,像睡著了一般刨肃。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上箩帚,一...
    開封第一講書人閱讀 51,554評(píng)論 1 305
  • 那天真友,我揣著相機(jī)與錄音,去河邊找鬼紧帕。 笑死盔然,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的是嗜。 我是一名探鬼主播愈案,決...
    沈念sama閱讀 40,302評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼鹅搪!你這毒婦竟也來了站绪?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,216評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤丽柿,失蹤者是張志新(化名)和其女友劉穎恢准,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體甫题,經(jīng)...
    沈念sama閱讀 45,661評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡馁筐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了坠非。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片敏沉。...
    茶點(diǎn)故事閱讀 39,977評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出盟迟,到底是詐尸還是另有隱情秋泳,我是刑警寧澤,帶...
    沈念sama閱讀 35,697評(píng)論 5 347
  • 正文 年R本政府宣布攒菠,位于F島的核電站轮锥,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏要尔。R本人自食惡果不足惜舍杜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望赵辕。 院中可真熱鬧既绩,春花似錦、人聲如沸还惠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蚕键。三九已至救欧,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間锣光,已是汗流浹背笆怠。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評(píng)論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留誊爹,地道東北人蹬刷。 一個(gè)月前我還...
    沈念sama閱讀 48,138評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像频丘,于是被迫代替她去往敵國和親办成。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評(píng)論 2 355

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