2020-03-16-排序二叉樹轉(zhuǎn)化為雙向鏈表

排序二叉樹轉(zhuǎn)化為雙向鏈表

問題描述:
輸入一棵二叉搜索樹,將該二叉搜索樹轉(zhuǎn)換成一個(gè)排序的循環(huán)雙向鏈表凉蜂。要求不能創(chuàng)建任何新的節(jié)點(diǎn)擅笔,只能調(diào)整樹中節(jié)點(diǎn)指針的指向。

這道題目注意審題岳服,注意雙向鏈表的表頭和表尾部是否連接,如果連接就是一個(gè)循環(huán)雙向鏈表蜕煌。

循環(huán)雙向鏈表+遞歸

思路上很直接派阱,在二叉搜索樹的中序遍歷基礎(chǔ)上,改變當(dāng)前節(jié)點(diǎn)root指針指向斜纪,因?yàn)槲覀冃枰獙?code>root->left 指向前一個(gè)順序遍歷的節(jié)點(diǎn),我們用一個(gè)指針pre表示當(dāng)前節(jié)點(diǎn)的前一個(gè)節(jié)點(diǎn)文兑。

解法一
遞歸返回頭節(jié)點(diǎn)和尾節(jié)點(diǎn)盒刚,注意遞歸傳遞的參數(shù)應(yīng)該是引用類型(不然debug搞死你。绿贞。因块。)

Node* treeToDoublyList(Node* root) {
        if(!root) return root;  //特判空節(jié)點(diǎn)
        Node*head=nullptr,*pre=nullptr;
        dfs(root,head,pre);
        head->left=pre;
        pre->right=head;
        return head;   
    }
    void dfs(Node*root,Node*&head,Node*&pre){
        if(!root) return ;
        dfs(root->left,head,pre);
        //cout<<root->val<<endl;
        if(!head){
            head=root;
            pre=root;
        }
        else{
            pre->right=root;
            root->left=pre;
            pre=root;
        }
        dfs(root->right,head,pre);
    }

解法2

大體和上面一樣遞歸,但是遞歸的時(shí)候沒有保存頭節(jié)點(diǎn),而是在把節(jié)點(diǎn)指針順序改變好之后(實(shí)際上這個(gè)時(shí)候雙鏈表已經(jīng)建好了)通過鏈表的反向遍歷找到頭節(jié)點(diǎn)

Node*pre=NULL;
    Node* treeToDoublyList(Node* root) {
        if(!root) return root;
        dfs(root);
      //反向遍歷尋找頭節(jié)點(diǎn)
        auto head=pre;
        while(head&&head->left) head=head->left;
        head->left=pre;
        pre->right=head;
        return head;
    }
    void dfs(Node*root){
        if(!root) return ;
        dfs(root->left);
        root->left=pre;
        if(pre) pre->right=root;
        pre=root;
        dfs(root->right);
    }

解法3 利用棧非遞歸中序遍歷

中序的非遞歸遍歷經(jīng)常用到籍铁,因?yàn)槎嫠阉鳂涞闹行虮闅v后結(jié)果是一個(gè)有序

Node* treeToDoublyList(Node* root) {
        if(!root) return root;
        stack<Node*> stk;
        Node*pre=NULL,*head=NULL;
        while(root||stk.size()){
            while(root){
                stk.push(root);
                root=root->left;
            }
            root=stk.top();
            stk.pop();
            root->left=pre;
            if(pre) pre->right=root;
            pre=root;
            root=root->right;
        }
        head=pre;
        while(head&&head->left) head=head->left;
        head->left=pre;
        pre->right=head;
        return head;
    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末涡上,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子拒名,更是在濱河造成了極大的恐慌吩愧,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,948評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件增显,死亡現(xiàn)場(chǎng)離奇詭異雁佳,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)同云,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門糖权,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人炸站,你說我怎么就攤上這事星澳。” “怎么了旱易?”我有些...
    開封第一講書人閱讀 157,490評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵禁偎,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我咒唆,道長(zhǎng)届垫,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,521評(píng)論 1 284
  • 正文 為了忘掉前任全释,我火速辦了婚禮装处,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己妄迁,他們只是感情好寝蹈,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,627評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著登淘,像睡著了一般箫老。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上黔州,一...
    開封第一講書人閱讀 49,842評(píng)論 1 290
  • 那天耍鬓,我揣著相機(jī)與錄音,去河邊找鬼流妻。 笑死牲蜀,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的绅这。 我是一名探鬼主播涣达,決...
    沈念sama閱讀 38,997評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼证薇!你這毒婦竟也來了度苔?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,741評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤浑度,失蹤者是張志新(化名)和其女友劉穎寇窑,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體俺泣,經(jīng)...
    沈念sama閱讀 44,203評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡疗认,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,534評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了伏钠。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片横漏。...
    茶點(diǎn)故事閱讀 38,673評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖熟掂,靈堂內(nèi)的尸體忽然破棺而出缎浇,到底是詐尸還是另有隱情,我是刑警寧澤赴肚,帶...
    沈念sama閱讀 34,339評(píng)論 4 330
  • 正文 年R本政府宣布素跺,位于F島的核電站,受9級(jí)特大地震影響誉券,放射性物質(zhì)發(fā)生泄漏指厌。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,955評(píng)論 3 313
  • 文/蒙蒙 一踊跟、第九天 我趴在偏房一處隱蔽的房頂上張望踩验。 院中可真熱鬧,春花似錦、人聲如沸箕憾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)袭异。三九已至钠龙,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間御铃,已是汗流浹背碴里。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留畅买,地道東北人并闲。 一個(gè)月前我還...
    沈念sama閱讀 46,394評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像谷羞,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子溜徙,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,562評(píng)論 2 349

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