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)查看詳情吧