所以現在,當我有一棵看起來像這樣的樹時:
5
\
6
\
7
\
9
我可以按級別順序列印它,以便
5,
6,
7,
9,
這是列印的
但是,我想讓它列印出如下內容:
5,
0, 6,
0, 0, 0, 7,
0, 0, 0, 0, 0, 0, 0, 9,
這樣所有的 NULL 節點也列印為 0。
void current_height(tree *root, int level){
if(root == NULL){
return;
}
if(level == 1){
printf("%d, ", root->data);
}
else if(level > 1){
current_height(root->left, level - 1);
current_height(root->right, level - 1);
}
}
這是我到目前為止的代碼
順便說一句,我還考慮將索引放入結構樹中,以便我可以將樹更改為陣列并列印陣列。但我發現它會使洗掉功能過于復雜,所以我沒有使用這個想法
uj5u.com熱心網友回復:
您必須模擬不存在的樹內容。
由于您將相對目標級別的資訊作為您的附加引數已經到位,這并不難。
如果在目標深度之前有 NULL 指標,只需發明更多的樹節點,始終將 NULL 作為發明指標。
void current_height(tree *root, int level){
if(root == NULL){
if (level>1){
current_height(NULL, level - 1);
current_height(NULL, level - 1);
}
else {
printf("%d, ", 0);
}
return;
}
if(level == 1){
printf("%d, ", root->data);
}
else if(level > 1){
current_height(root->left, level - 1);
current_height(root->right, level - 1);
}
}
這里的輸出https://www.onlinegdb.com/online_c_compiler是:
5,
0, 6,
0, 0, 0, 7,
0, 0, 0, 0, 0, 0, 0, 9,
uj5u.com熱心網友回復:
首先,呼叫current_height每個節點(遍歷該節點上的整個子樹)會使該演算法效率低下。
你可以使用這個想法:
創建一個用于存盤當前節點級別的陣列。確保它的大小可以包含底層。
在索引 0 處存盤根參考。
然后迭代級別:
列印當前在陣列中的節點的資料
用它的兩個子節點替換每個節點——或者當節點實際上是 a 時
NULL,將兩個NULL值放入陣列中。為了避免資料在讀取之前被覆寫,從最右邊的填充節點向后迭代陣列到索引 0,并從右到左存盤子節點。這樣,在讀取之前不會覆寫父母。
這是一個實作:
void level_order(tree *root) {
if (root == NULL) return; // Nothing to print
int h = height(root) - 1;
tree *level[1<<h]; // Allocate 2^h entries
level[0] = root;
for (int depth = 0; depth <= h; depth ) {
for (int j = (1<<depth) - 1; j >= 0; j--) {
tree *node = level[j];
int isNode = node != NULL;
printf("%d, ", isNode ? node->data : 0);
if (depth < h) { // Collect children for next iteration
level[2*j 1] = isNode ? node->left : NULL;
level[2*j] = isNode ? node->right : NULL;
}
}
printf("\n");
}
}
請注意,您的height函式回傳樹中的級別數。“高度”的標準定義是從根到其最遠葉的路徑長度,以邊數表示(參見Wikipedia)。因此,只有一個節點的樹的高度為 0,而空樹 ( NULL) 的高度為 -1。這就是上述代碼從height()呼叫回傳的值中減去 1 的原因。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/487162.html
下一篇:將字符以矩陣形式放入二維陣列中
