筆試刷題-頭條2018-05-31

題目描述

/** 
題目描述 
以下函數(shù)用于將一顆二叉搜索樹轉(zhuǎn)換成一個(gè)有序的雙向鏈表。 
要求不能創(chuàng)建任何新的節(jié)點(diǎn)褪子,只能調(diào)整樹種節(jié)點(diǎn)指針的指向辙售。 
 
如輸入下圖中左邊的二叉搜索樹轻抱,則輸出轉(zhuǎn)換后的排序雙向鏈表: 
 
      10 
 
    /      \ 
 
   6      14 
 
  /  \      /  \ 
 
4   8  12  16 
 
轉(zhuǎn)換成: 
 
 4 <=> 6 <=> 8 <=> 10 <=> 12  <=> 14 <=> 16 
 
*/   

思路如下:
采用的是bfs的思想,從root開始圾亏,然后依次放入其lch rch分別處理指針十拣,由于要標(biāo)記什么節(jié)點(diǎn)已經(jīng)處理過了,但是這里可以不用志鹃,由于原來是樹沒有環(huán)夭问,但是雙向鏈表是有環(huán)的圖,所以可以通過如此判斷有無換然后判斷什么指針已經(jīng)處理過了曹铃,然后采用bfs遍歷一遍樹缰趋,同時(shí)修改指針即可。若一個(gè)當(dāng)前的node->left=node->left->right形成換陕见,那么node->left不用再被處理了

轉(zhuǎn)化代碼如下:

struct Node{  
    int val=-1;  
    Node *left=NULL;  
    Node *right=NULL;  
    Node(){}  
    Node(int val){  
        this->val = val;  
        this->left = NULL;  
        this->right = NULL;  
    }  
};  
Node *Convert(Node *root){  
    if(root==NULL)  
        return root;  
    Node *listHead = root;  
    while(listHead->left!=NULL)  
        listHead = listHead->left;  
    //重構(gòu)  
    queue<Node*> que;  
    que.push(root);  
    set<Node*> marked;  
    while(!que.empty()){  
        Node *cur = que.front();  
        que.pop();  
        if(cur->left && (cur->left->right!=cur)){  
            //先入隊(duì)列  
            que.push(cur->left);  
            Node *curLeft = cur->left;  
            while(curLeft->right)  
                curLeft = curLeft->right;  
            //改動指針  
            cur->left = curLeft;  
            curLeft->right = cur;  
        }  
        if(cur->right && (cur->right->left!=cur)){  
            //先入隊(duì)列  
            que.push(cur->right);  
            Node *curRight = cur->right;  
            while(curRight->left)  
                curRight = curRight->left;  
            //改動指針  
            cur->right = curRight;  
            curRight->left = cur;  
        }  
    }  
    return listHead;  
}  

測試題目例子代碼:

int main(){
    Node *n1 = new Node(10);
    Node *n2 = new Node(6);
    Node *n3 = new Node(14);
    Node *n4 = new Node(4);
    Node *n5 = new Node(8);
    Node *n6 = new Node(12);
    Node *n7 = new Node(16);
    n1->left = n2;
    n1->right = n3;
    n2->left = n4;
    n2->right = n5;
    n3->left = n6;
    n3->right = n7;
    Node *listHead = Convert(n1);
    Node *reversedListHead;
    Node *cur = listHead;
    while(cur){
        printf("%d ", cur->val);
        if(!cur->right)
            reversedListHead = cur;
        cur = cur->right;
    }
    printf("\n");
    cur = reversedListHead;
    while(cur){
        printf("%d ", cur->val);
        cur = cur->left;
    }
    return 0;
}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末秘血,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子评甜,更是在濱河造成了極大的恐慌灰粮,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,589評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件忍坷,死亡現(xiàn)場離奇詭異粘舟,居然都是意外死亡熔脂,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評論 3 396
  • 文/潘曉璐 我一進(jìn)店門柑肴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來霞揉,“玉大人,你說我怎么就攤上這事晰骑∈手龋” “怎么了?”我有些...
    開封第一講書人閱讀 165,933評論 0 356
  • 文/不壞的土叔 我叫張陵硕舆,是天一觀的道長秽荞。 經(jīng)常有香客問我,道長岗宣,這世上最難降的妖魔是什么蚂会? 我笑而不...
    開封第一講書人閱讀 58,976評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮耗式,結(jié)果婚禮上胁住,老公的妹妹穿的比我還像新娘。我一直安慰自己刊咳,他們只是感情好彪见,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,999評論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著娱挨,像睡著了一般余指。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上跷坝,一...
    開封第一講書人閱讀 51,775評論 1 307
  • 那天酵镜,我揣著相機(jī)與錄音,去河邊找鬼柴钻。 笑死淮韭,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的贴届。 我是一名探鬼主播靠粪,決...
    沈念sama閱讀 40,474評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼毫蚓!你這毒婦竟也來了占键?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,359評論 0 276
  • 序言:老撾萬榮一對情侶失蹤元潘,失蹤者是張志新(化名)和其女友劉穎畔乙,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體翩概,經(jīng)...
    沈念sama閱讀 45,854評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡啸澡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,007評論 3 338
  • 正文 我和宋清朗相戀三年袖订,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嗅虏。...
    茶點(diǎn)故事閱讀 40,146評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖上沐,靈堂內(nèi)的尸體忽然破棺而出皮服,到底是詐尸還是另有隱情,我是刑警寧澤参咙,帶...
    沈念sama閱讀 35,826評論 5 346
  • 正文 年R本政府宣布龄广,位于F島的核電站,受9級特大地震影響蕴侧,放射性物質(zhì)發(fā)生泄漏择同。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,484評論 3 331
  • 文/蒙蒙 一净宵、第九天 我趴在偏房一處隱蔽的房頂上張望敲才。 院中可真熱鬧,春花似錦择葡、人聲如沸紧武。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽阻星。三九已至,卻和暖如春已添,著一層夾襖步出監(jiān)牢的瞬間妥箕,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評論 1 272
  • 我被黑心中介騙來泰國打工更舞, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留畦幢,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,420評論 3 373
  • 正文 我出身青樓疏哗,卻偏偏與公主長得像呛讲,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子返奉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,107評論 2 356

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

  • 思路如下:由于只有兩個(gè)字符贝搁,就找其中一個(gè)字符來變,另一個(gè)也變芽偏,看最后可以組成的最長字符串 維護(hù)兩個(gè)列表去記錄兩個(gè)字...
    Dodo159753閱讀 604評論 0 0
  • 動態(tài)規(guī)劃 111. 爬樓梯思路類似斐波那契數(shù)列注意考慮第 0 階的特殊情況 272. 爬樓梯 II思路類似上題雷逆,只...
    6默默Welsh閱讀 2,431評論 0 1
  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問題, 分享了一些自己做題目的經(jīng)驗(yàn)。 張土汪:刷leetcod...
    土汪閱讀 12,747評論 0 33
  • 聽說洋蔥和蒲公英拌沙拉更配哦 如果能吃辣污尉,再放點(diǎn)青椒絲膀哲,這樣更能綜合下蒲公英的微寒性呢 風(fēng)味沙拉~ 我今天晚上吃的...
    溫迪畫畫閱讀 252評論 0 0
  • 今天中午我在微信上看到妹妹發(fā)來老家的照片往产,是的,就是老家門前青悠悠的菜地的照片某宪!打電話一問仿村,妹妹說和老爸一起回老家...
    魏sir閱讀 331評論 0 1