面試題36. 二叉搜索樹與雙向鏈表

題目

輸入一棵二叉搜索樹,將該二叉搜索樹轉換成一個排序的循環(huán)雙向鏈表疫粥。要求不能創(chuàng)建任何新的節(jié)點茬斧,只能調整樹中節(jié)點指針的指向。

為了讓您更好地理解問題梗逮,以下面的二叉搜索樹為例:


image.png

我們希望將這個二叉搜索樹轉化為雙向循環(huán)鏈表项秉。鏈表中的每個節(jié)點都有一個前驅和后繼指針。對于雙向循環(huán)鏈表慷彤,第一個節(jié)點的前驅是最后一個節(jié)點娄蔼,最后一個節(jié)點的后繼是第一個節(jié)點。

下圖展示了上面的二叉搜索樹轉化成的鏈表底哗∷晁撸“head” 表示指向鏈表中有最小元素的節(jié)點。

image.png

特別地跋选,我們希望可以就地完成轉換操作涕癣。當轉化完成以后,樹中節(jié)點的左指針需要指向前驅野建,樹中節(jié)點的右指針需要指向后繼属划。還需要返回鏈表中的第一個節(jié)點的指針恬叹。

注意:本題與主站 426 題相同:https://leetcode-cn.com/problems/convert-binary-search-tree-to-sorted-doubly-linked-list/

注意:此題對比原題有改動。

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/er-cha-sou-suo-shu-yu-shuang-xiang-lian-biao-lcof
著作權歸領扣網絡所有同眯。商業(yè)轉載請聯(lián)系官方授權绽昼,非商業(yè)轉載請注明出處。

解法

首先是遞歸须蜗,前序遍歷硅确。
但是問題是,在最后的結果中明肮,root左邊的不是root.left菱农,這就需要把左子樹和root相接的節(jié)點找出來,同理柿估,右子樹也要找出來循未。

我的解法

由于左右子樹的處理方式不一樣,所以只傳root進行遞歸不夠用秫舌,就加上了標記位isLeft的妖,如果處理的節(jié)點是左節(jié)點,連接好之后足陨,一直向右找到尾巴返回嫂粟。

class Solution:
    def treeToDoublyList(self, root: 'Node') -> 'Node':
        if not root: return None
        last = self.convert(root, True)
        while root.left : root = root.left
        root.left = last
        last.right = root
        return root

    def convert(self, root, isLeft):
        if not root : return None
        if root.left: 
            root.left = self.convert(root.left, isLeft)
            root.left.right = root
        if root.right: 
            root.right = self.convert(root.right, not isLeft)
            root.right.left = root
        pLastNode = root
        if isLeft:
            while pLastNode.right : pLastNode = pLastNode.right
        else:
            while pLastNode.left : pLastNode = pLastNode.left
        return pLastNode

大佬解法

劍指面試題[36]——二叉搜索樹與雙向鏈表 - 挪羅兒的文章 - 知乎
https://zhuanlan.zhihu.com/p/105103682
我全都要,返回的時候直接把左右兩邊都返回墨缘,就不需要像我這樣每次跑這么遠去找頭或者尾巴星虹。

class Solution:
    def treeToDoublyList(self, root: 'Node') -> 'Node':
        if not root: return None
        l_head, r_tail = self.convert(root)
        l_head.left, r_tail.right = r_tail,l_head
        return l_head

    def convert(self, root):
        if root.left:
            l_head,l_tail = self.convert(root.left)
            l_tail.right = root
            root.left = l_tail
        else:
            l_head = root
        if root.right:
            r_head, r_tail = self.convert(root.right)
            r_head.left = root
            root.right = r_head
        else:
            r_tail = root

        return l_head, r_tail

總結

題目本身不難,花了太多時間镊讼。
一開始沒有考慮左右子樹不一樣的問題宽涌,導致每次返回都是一樣的,出錯蝶棋。
后來考慮到护糖,傳參判斷是左子樹還是右子樹。
比較簡單的寫法是左右兩個都返回嚼松。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末嫡良,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子献酗,更是在濱河造成了極大的恐慌寝受,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件罕偎,死亡現(xiàn)場離奇詭異很澄,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進店門甩苛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蹂楣,“玉大人,你說我怎么就攤上這事讯蒲∪粒” “怎么了?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵墨林,是天一觀的道長赁酝。 經常有香客問我,道長旭等,這世上最難降的妖魔是什么酌呆? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮搔耕,結果婚禮上隙袁,老公的妹妹穿的比我還像新娘。我一直安慰自己弃榨,他們只是感情好藤乙,可當我...
    茶點故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著惭墓,像睡著了一般。 火紅的嫁衣襯著肌膚如雪而姐。 梳的紋絲不亂的頭發(fā)上腊凶,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天,我揣著相機與錄音拴念,去河邊找鬼钧萍。 笑死,一個胖子當著我的面吹牛政鼠,可吹牛的內容都是我干的风瘦。 我是一名探鬼主播,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼公般,長吁一口氣:“原來是場噩夢啊……” “哼万搔!你這毒婦竟也來了?” 一聲冷哼從身側響起官帘,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤瞬雹,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后刽虹,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體酗捌,經...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了胖缤。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片尚镰。...
    茶點故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖哪廓,靈堂內的尸體忽然破棺而出狗唉,到底是詐尸還是另有隱情,我是刑警寧澤撩独,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布敞曹,位于F島的核電站,受9級特大地震影響综膀,放射性物質發(fā)生泄漏澳迫。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一剧劝、第九天 我趴在偏房一處隱蔽的房頂上張望橄登。 院中可真熱鬧,春花似錦讥此、人聲如沸拢锹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽卒稳。三九已至,卻和暖如春他巨,著一層夾襖步出監(jiān)牢的瞬間充坑,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工染突, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留捻爷,地道東北人。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓份企,卻偏偏與公主長得像也榄,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子司志,可洞房花燭夜當晚...
    茶點故事閱讀 45,685評論 2 360

推薦閱讀更多精彩內容

  • 二叉搜索樹與雙向鏈表 題目描述 輸入一棵二叉搜索樹甜紫,將該二叉搜索樹轉換成一個排序的循環(huán)雙向鏈表。要求不能創(chuàng)建任何新...
    阿星啊阿星閱讀 251評論 0 0
  • 題目描述 輸入一棵二叉搜索樹骂远,將該二叉搜索樹轉換成一個排序的雙向鏈表棵介。要求不能創(chuàng)建任何新的結點,只能調整樹中結點指...
    凌霄文強閱讀 158評論 0 1
  • 輸入一棵二叉搜索樹吧史,將該二叉搜索樹轉換成一個排序的雙向鏈表邮辽。要求不能創(chuàng)建任何新的結點唠雕,只能調整樹中結點指針的指向。...
    繁星追逐閱讀 125評論 0 0
  • 題目描述 輸入一棵二叉搜索樹吨述,將該二叉搜索樹轉換成一個排序的雙向鏈表岩睁。要求不能創(chuàng)建任何新的結點,只能調整樹中結點指...
    shenghaishxt閱讀 173評論 0 0
  • 很快就要冬至了揣云。冬至捕儒,按字面意思,是冬天的極限邓夕,還是冬天的來臨刘莹?這取決于對“至”的理解。 按照正常人的體驗焚刚,冬至這...
    Piscine閱讀 404評論 1 1