將二叉查找樹轉(zhuǎn)換為鏈表

在不創(chuàng)建任何新節(jié)點的條件下將二叉查找樹轉(zhuǎn)換為排序的雙向鏈表鳖孤。

二叉查找樹

solution_1

二叉查找樹的特點就是左子節(jié)點<根節(jié)點<右子節(jié)點所以朗若,想辦法用中序遍歷調(diào)整一下指針的指向就可以了

我們有一個樹的根節(jié)點趾牧,然后假設(shè)還有一個鏈表的尾結(jié)點(因為我們從最小的節(jié)點開始愧哟,所以是往鏈表的后面加新的節(jié)點)

然后褪贵,根據(jù)我們的思路匣摘,我們要從樹的最底層開始往上亏吝,并且是中序遍歷
樹里面最常用的就是遞歸
因此我們先找到最底層的左子樹(如果有的話)

if (root->left)
        transform(pcurrent->left,plastListNode);

這樣一直到pcurrent->left->left是NULL為止岭埠,這個時候pcurrent->left是最后一個非空節(jié)點。

然后我們進(jìn)行一些修改指針指向的工作:

pcurrent->left = plastListNode;

    if (plastListNode)
    {
        plastListNode->right = pcurrent;
    }
    plastListNode = pcurrent;

大家可以自己演練一下怎么指指針。惜论。

然后在后面许赃,由于是中序遍歷,所以加上右邊的就可以了

#include <iostream>

struct treeNode
{
    int data;
    treeNode* left;
    treeNode* right;
};

void transform(treeNode* root,treeNode*& plastListNode)
{
    if (!root)
        return;
    treeNode* pcurrent=root;
    if (root->left)
        transform(pcurrent->left,plastListNode);
    pcurrent->left = plastListNode;

    if (plastListNode)
    {
        plastListNode->right = pcurrent;
    }
    plastListNode = pcurrent;

    if (pcurrent->right)
        transform(pcurrent->right, plastListNode);
    
}
treeNode* solution1(treeNode* tree)
{
    treeNode* list = NULL;
    transform(tree, list);
    treeNode* headOfList = list;
    while (headOfList&&headOfList->left)//轉(zhuǎn)換到表頭
        headOfList = headOfList->left;
    return headOfList;
}

solution_2

第二種解法呢馆类,和我們一般的思維比較像混聊,分左邊和右邊兩種情況調(diào)整指針指向。
if (tree->left) pleft = transform_2(tree->left, false); //now pleft is the last & left of tree if (pleft) { pleft->right = tree; //tree->left = pleft; }
這段代碼就是先找到最左邊的節(jié)點乾巧,然后讓pleft的右指針指向其父節(jié)點句喜。
其實我覺得//tree->left = pleft;這句話是不需要的,因為本來tree就是pleft的父節(jié)點卧抗,我把這行代碼注釋掉試了一下也是可以的藤滥。

然后后面就是同樣的對最下面的右節(jié)點進(jìn)行調(diào)整。

調(diào)整完了之后社裆,為了之后的工作拙绊,我們把指針的位置調(diào)整到鏈表的頭或者尾。
取決于我們當(dāng)前調(diào)整的節(jié)點是左邊的還是右邊的泳秀。每次調(diào)整結(jié)束后标沪,我們的指針總是指向父節(jié)點:

  • 如果調(diào)整的是左邊的,那么調(diào)整結(jié)束后嗜傅,我們把指針右移到最右端金句,方便接著;
  • 如果是右邊的吕嘀,我們把指針移到鏈表的最開始违寞,方便打印。
    偶房。趁曼。其實我還是沒懂為啥要這樣調(diào)整。(主要是遞歸的執(zhí)行過程)

我寫了一個打印的程序試了一下:

執(zhí)行結(jié)果

這個還需要再理解棕洋。挡闰。


code:

treeNode* transform_2(treeNode* tree, bool asright)
{
    if (!tree)
        return NULL;
    treeNode* tmp=tree;
    treeNode* pleft=NULL;//what?!!!-ver3.0
    treeNode* pright=NULL;
    if (tmp->left)
        pleft = transform_2(tmp->left, false);
    //now pleft is the last & left of tree
    if (pleft)
    {
        pleft->right = tmp;
        //tree->left = pleft;
        std::cout << "connectleft" << "\n";
    }

    if (tmp->right)
        pright = transform_2(tmp->right, true);
    if (pright)
    {
        
        pright->left = tmp;
        //tree->right = pright;
        std::cout << "connectright" << "\n";
    }

    treeNode* phead = tree;
    if (asright)
    {
        while (phead->left)
            phead = phead->left;
        std::cout << "asright" << "\n";
    }
    else
    {
        while (phead->right)
        {
            phead = phead->right;
        }
        std::cout << "asleft" << "\n";
    }
    return phead;
}

文章參考何海濤大神文章

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市掰盘,隨后出現(xiàn)的幾起案子摄悯,更是在濱河造成了極大的恐慌,老刑警劉巖愧捕,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件奢驯,死亡現(xiàn)場離奇詭異,居然都是意外死亡次绘,警方通過查閱死者的電腦和手機叨橱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進(jìn)店門典蜕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人罗洗,你說我怎么就攤上這事愉舔。” “怎么了伙菜?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵轩缤,是天一觀的道長。 經(jīng)常有香客問我贩绕,道長火的,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任淑倾,我火速辦了婚禮馏鹤,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘娇哆。我一直安慰自己湃累,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布碍讨。 她就那樣靜靜地躺著治力,像睡著了一般。 火紅的嫁衣襯著肌膚如雪勃黍。 梳的紋絲不亂的頭發(fā)上宵统,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天,我揣著相機與錄音覆获,去河邊找鬼马澈。 笑死,一個胖子當(dāng)著我的面吹牛弄息,可吹牛的內(nèi)容都是我干的痊班。 我是一名探鬼主播,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了烙常?” 一聲冷哼從身側(cè)響起朝捆,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎国章,沒想到半個月后具钥,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡液兽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年骂删,在試婚紗的時候發(fā)現(xiàn)自己被綠了掌动。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,932評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡宁玫,死狀恐怖粗恢,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情欧瘪,我是刑警寧澤眷射,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站佛掖,受9級特大地震影響妖碉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜芥被,卻給世界環(huán)境...
    茶點故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一欧宜、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧拴魄,春花似錦冗茸、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至职员,卻和暖如春麻蹋,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背焊切。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工扮授, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人专肪。 一個月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓刹勃,卻偏偏與公主長得像,于是被迫代替她去往敵國和親嚎尤。 傳聞我的和親對象是個殘疾皇子荔仁,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,884評論 2 354

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