C語言 二叉樹圖像打印铐姚!

有圖有真相

y

最近在學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)策肝,前面學(xué)的都還還好結(jié)構(gòu)也比較簡(jiǎn)單,學(xué)到二叉樹時(shí),思維量明顯提高之众。為了更好的更清晰的研究二叉樹拙毫,自己決定寫個(gè)打印二叉樹圖像的算法。

總體思想是利用層次遍歷棺禾,每遍歷到一個(gè)元素就將它打印出來缀蹄,這樣就能從頭到尾打印出一顆二叉樹。其中難點(diǎn)主要是隨著二叉樹的深度增加帘睦,每個(gè)元素間的間距也是在增大的。為了找這個(gè)規(guī)律坦康,我在excel里做了一個(gè)巨大的二叉樹竣付,一個(gè)格子一個(gè)格子數(shù)每行的間距,然后總結(jié)出來的通式滞欠。

主要代碼如下

//打印每個(gè)元素
void PrintTreeNode(char c,int h,int index){
    //基礎(chǔ)空格
    int blank = 3;
    
    //用于標(biāo)記是否為每行第一個(gè)元素
    bool flag = false;
    //確定元素所在行
    int line = 1;
    for(;line<=h;line++){
        if(index<=pow(2,line-1)){
            if(index == pow(2, line-1)){
                flag = true;
            }else{
                line--;
            }
            break;
        }
    }
    
    //每個(gè)字母的空格倍數(shù)
    int itemblank = blank;
    for(int i=1;i<h-line+1;i++){
        itemblank = itemblank*2+1;
    }
    
     //每行開頭字母的空格倍數(shù)
    int headblank = (itemblank-1)/2-1;
    if(flag){
        //新的一行的回車數(shù)
        int changelinenum = (itemblank-1)/4;
        if(changelinenum < 1){
            changelinenum = 1;
        }
        if(line == 1){
            changelinenum = 1;
        }
        
        //先回車換行
        for(int j=0;j<changelinenum;j++){
            printf("\n");
        }
        //在打印空格到正確的位置
        for(int i=0;i<headblank;i++){
            printf(" ");
        }
        
        //最后打印每行的第一個(gè)元素
        printf("%c",c);
    }else{
        //先打印空格到正確的位置
        for(int i=0;i<itemblank;i++){
            printf(" ");
        }
        //打印元素
        printf("%c",c);
    }
}

//h為二叉樹的高度
void PrintTree(BiTree T,int h){
    printf("\n");

    //二叉樹元素序號(hào)
    int index = 0;
    
    LinkQueue Q;
    InitQueue(&Q);
    
    //第一個(gè)元素先入隊(duì)
    EnQueue(&Q, T);
    
    //總數(shù)大于滿二叉樹最大值則退出循環(huán)
    while(index < pow(2,h)-1){
        BiTNode *node = DeQueue(&Q);
        index++;
        //將空的子樹也入隊(duì)古胆,這樣方便計(jì)算
        if(node == NULL){
            EnQueue(&Q, NULL);
            EnQueue(&Q, NULL);
            //打印第index個(gè)元素
            PrintTreeNode(' ',h,index);
        }else{
            EnQueue(&Q, node->lChild);
            EnQueue(&Q, node->rChild);
            //打印第index個(gè)元素
            PrintTreeNode(node->data,h,index);
        }
    }
    
    printf("\n");
}

希望對(duì)大家有幫助
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市筛璧,隨后出現(xiàn)的幾起案子逸绎,更是在濱河造成了極大的恐慌,老刑警劉巖夭谤,帶你破解...
    沈念sama閱讀 212,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件棺牧,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡朗儒,警方通過查閱死者的電腦和手機(jī)颊乘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來醉锄,“玉大人乏悄,你說我怎么就攤上這事】也唬” “怎么了檩小?”我有些...
    開封第一講書人閱讀 158,369評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)烟勋。 經(jīng)常有香客問我规求,道長(zhǎng),這世上最難降的妖魔是什么卵惦? 我笑而不...
    開封第一講書人閱讀 56,799評(píng)論 1 285
  • 正文 為了忘掉前任颓哮,我火速辦了婚禮,結(jié)果婚禮上鸵荠,老公的妹妹穿的比我還像新娘冕茅。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,910評(píng)論 6 386
  • 文/花漫 我一把揭開白布姨伤。 她就那樣靜靜地躺著哨坪,像睡著了一般。 火紅的嫁衣襯著肌膚如雪乍楚。 梳的紋絲不亂的頭發(fā)上当编,一...
    開封第一講書人閱讀 50,096評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音徒溪,去河邊找鬼忿偷。 笑死,一個(gè)胖子當(dāng)著我的面吹牛臊泌,可吹牛的內(nèi)容都是我干的鲤桥。 我是一名探鬼主播,決...
    沈念sama閱讀 39,159評(píng)論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼渠概,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼茶凳!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起播揪,我...
    開封第一講書人閱讀 37,917評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤贮喧,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后猪狈,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體箱沦,經(jīng)...
    沈念sama閱讀 44,360評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,673評(píng)論 2 327
  • 正文 我和宋清朗相戀三年雇庙,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了饱普。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,814評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡状共,死狀恐怖套耕,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情峡继,我是刑警寧澤冯袍,帶...
    沈念sama閱讀 34,509評(píng)論 4 334
  • 正文 年R本政府宣布,位于F島的核電站碾牌,受9級(jí)特大地震影響康愤,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜舶吗,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,156評(píng)論 3 317
  • 文/蒙蒙 一征冷、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧誓琼,春花似錦检激、人聲如沸肴捉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)齿穗。三九已至,卻和暖如春饺律,著一層夾襖步出監(jiān)牢的瞬間窃页,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評(píng)論 1 267
  • 我被黑心中介騙來泰國(guó)打工复濒, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留脖卖,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,641評(píng)論 2 362
  • 正文 我出身青樓巧颈,卻偏偏與公主長(zhǎng)得像畦木,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子洛二,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,728評(píng)論 2 351

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

  • 樹形結(jié)構(gòu)是一種十分重要的數(shù)據(jù)結(jié)構(gòu)馋劈。二叉樹攻锰、樹與樹林都屬于樹形結(jié)構(gòu)晾嘶。 樹形結(jié)構(gòu)每個(gè)結(jié)點(diǎn)最多只有一個(gè)前驅(qū)結(jié)點(diǎn),但可以有...
    cain_huang閱讀 1,965評(píng)論 0 11
  • 上一篇文章講述了樹的概念娶吞, 特征以及分類垒迂, 旨在讓我們理解什么是樹, 樹的一些常用的概念是什么妒蛇,樹的分類有哪些等机断。...
    DevCW閱讀 2,016評(píng)論 4 10
  • 樹的概述 樹是一種非常常用的數(shù)據(jù)結(jié)構(gòu)老充,樹與前面介紹的線性表州藕,棧,隊(duì)列等線性結(jié)構(gòu)不同浓领,樹是一種非線性結(jié)構(gòu) 1.樹的定...
    Jack921閱讀 4,445評(píng)論 1 31
  • 數(shù)據(jù)結(jié)構(gòu)和算法--二叉樹的實(shí)現(xiàn) 幾種二叉樹 1陶耍、二叉樹 和普通的樹相比奋蔚,二叉樹有如下特點(diǎn): 每個(gè)結(jié)點(diǎn)最多只有兩棵子...
    sunhaiyu閱讀 6,434評(píng)論 0 14
  • 澳大利亞的秋天,是分地點(diǎn)的烈钞。我們?cè)谏较卤г故顭峋脺蝗セ蛘吆馔灰u而來時(shí)泊碑,山上早已開始染盡紅霜,層層疊疊的綻放毯欣,不...
    wingswithsong閱讀 231評(píng)論 0 0