真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

打印一棵類似于文件管理器中(tree命令下)的文件目錄樹的二叉樹-創(chuàng)新互聯(lián)

cmd命令行下,通過tree命令可打印當(dāng)前文件夾的一棵文件目錄樹,如左下圖

成都創(chuàng)新互聯(lián)公司專業(yè)為企業(yè)提供西盟網(wǎng)站建設(shè)、西盟做網(wǎng)站、西盟網(wǎng)站設(shè)計、西盟網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計與制作、西盟企業(yè)網(wǎng)站模板建站服務(wù),十余年西盟做網(wǎng)站經(jīng)驗,不只是建網(wǎng)站,更提供有價值的思路和整體網(wǎng)絡(luò)服務(wù)。

那么如何實現(xiàn)打印一棵類似于上述樣式的二叉樹呢,如右上圖(靠上方為左子樹)

這樣的一棵二叉樹可以分解成以下幾個組成部分:

"│ ? ",? ? ? ? ?打印根節(jié)點的左子樹結(jié)點的值前,在其左側(cè)需要打印的格式控制部分

" ? ?"、? ? ? ? ??打印根節(jié)點的右子樹結(jié)點的值前,在其左側(cè)需要打印的格式控制部分

"├── "、? ? ?即將打印根節(jié)點的左子樹結(jié)點的值前,在其左側(cè)需要打印的表示部分

"└── "、? ? ?即將打印根節(jié)點的左子樹結(jié)點的值前,在其左側(cè)需要打印的表示部分

值(除值外,均占用四個空格位置)

由于打印不可以后退,只能是從左到右,所有在打印值前,必須將值前的所有格式控制符均打印出來后,再將值打印出來。

而處于左子樹或者是右子樹時,所需打印的格式控制符不同,所以采用了一個char類型的數(shù)組用于指示位于父節(jié)點的左“L”或右子樹“R”,祖先節(jié)點的左或右子樹......(此處使用的是全局變量數(shù)組,若使用局部變量數(shù)組,需要再函數(shù)參數(shù)中多加一個字符數(shù)組參數(shù))

函數(shù)的另一個參數(shù)depth則是指示遞歸到當(dāng)前節(jié)點的深度(設(shè)置第一層為0),初始調(diào)用時值為0

函數(shù)體中:

一、第一個if語句中用于打印輸出值前的格式控制符:

其中的for語句,在depth>=2時該句塊被執(zhí)行,當(dāng)leftOrRight[i]=='L'時,說明該節(jié)點位于i層祖先節(jié)點的左子樹處,應(yīng)該打印"│ ? ";當(dāng)leftOrRight[i]=='R'時,說明該節(jié)點位于i層祖先節(jié)點的右子樹處,應(yīng)該打印" ? ?"

其中的if-else語句中,在depth>=1時該句塊被執(zhí)行,當(dāng)leftOrRight[depth-1] == 'L',說明該節(jié)點位于其父節(jié)點的左子樹,應(yīng)該打印"├── ";當(dāng)leftOrRight[depth-1] == 'R',說明該節(jié)點位于其父節(jié)點的右子樹,應(yīng)該打印"└── "

二、打印完其左側(cè)格式控制部分后,若該節(jié)點為空則打印(null),輸出后return退出該層遞歸。否則則輸出該節(jié)點的值,若其左右子樹不為空,則需要進(jìn)行其左右子樹的遞歸打印

? 1. leftOrRight[depth] = 'L',把該子樹的標(biāo)記位設(shè)為'L',表明以下往的是該結(jié)點的左子樹遞歸,再遞歸調(diào)用該函數(shù)?outputTree(root->left, depth + 1),depth+1表明往下遞歸深度加1

? 2. 當(dāng)?leftOrRight[depth] = 'R'時,表明返回到該層時,說明該結(jié)點左子樹已經(jīng)輸出完畢,該子樹的標(biāo)記位設(shè)為'R',該向右子樹遍歷,outputTree(root->right, depth + 1);

調(diào)用方式:

cout<< "該樹的樹狀結(jié)構(gòu)為:(靠近上方為左子樹)"<< endl;
outputTree(root, 0);

代碼如下:

char leftOrRight[100] = { 'L' }; //全局變量
void outputTree(TreeNode* root, int depth) {
    //樹根結(jié)點沒有其他輸出
    if (depth>0) {
        for (int i = 0; i<= depth - 2; i++) { //當(dāng)深度大于2時才會有該深度結(jié)點左邊的格式("│   "還是 "    ")輸出
            if (leftOrRight[i] == 'L') cout<< "│   "; //共4個符號位
            else cout<< "    ";
        }
        //深度大于1即可有該輸出,且是通過觀察其母結(jié)點剛開始左邊(輸出"├── ")or已經(jīng)遍歷完左邊開始右邊("└── ")
        if (leftOrRight[depth-1] == 'L') cout<< "├── ";
        else cout<< "└── ";
    }
    
    if (root == NULL) {
        cout<< "(null)"<< endl;
        return;
    }
    //不為空則輸出其結(jié)點值并換行
    cout<< root->val<< '\n';
    //若該結(jié)點左右為空則沒必要往下遞歸
    if (root->left == NULL && root->right == NULL) return;

    //開始進(jìn)行該結(jié)點的左右子樹的遞歸,先把該子樹的標(biāo)記位設(shè)為'L',表明往的是該樹的左子樹遞歸
    leftOrRight[depth] = 'L';
    //往下遞歸深度加1
    outputTree(root->left, depth + 1);
    //返回到該層時,說明該結(jié)點左子樹已經(jīng)輸出完畢,該子樹的標(biāo)記位設(shè)為'R',該向右子樹遍歷
    leftOrRight[depth] = 'R';

    outputTree(root->right, depth + 1);
}

其實這種用數(shù)組的方式來存儲該結(jié)點位于其父結(jié)點、祖先節(jié)點的左或右子樹的方式,也可以用于進(jìn)行哈夫曼(霍夫曼)編碼

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧


網(wǎng)站題目:打印一棵類似于文件管理器中(tree命令下)的文件目錄樹的二叉樹-創(chuàng)新互聯(lián)
標(biāo)題鏈接:http://weahome.cn/article/dshcps.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部