2014-02-24 58 views
1

我想打印我的BST的內容以樹的形式像BST:打印樹格式中的Turbo C

我當前的打印輸出:

10 - > 20 - > 30 - > 40 - > 60 - > 80 - > 90 - >

什麼,我希望它是這樣的:

 40 
     /\ 
    /\ 
    20 60 
    /\ \ 
    10 30 80 
       \ 
       90 

我試着做一些gotoxy但出於某種原因,我只是不能得到它來打印就像一棵樹,我認爲我需要做的不僅僅是gotoxy。另外「\」並不是真正必要的,只是一個附加功能,不會讓你們任何人感到困惑。

的代碼如下:

結構:

struct btnode 
{ 
    int value; 
    struct btnode *l; 
    struct btnode *r; 
}*root = NULL, *temp = NULL, *t2, *t1; 

打印:

void inorder(struct btnode *t) 
{ 
    if (root == NULL) 
    { 
     printf("No elements in a tree to display"); 
     return; 
    } 
    if (t->l != NULL)  
     inorder(t->l); 
     printf("%d -> ", t->value); 
    if (t->r != NULL)  
     inorder(t->r); 
} 

我試圖在樹印:

void print(struct btnode *t, int x, int i, int y) 
{ 
    i = i/2 + 2; 
    if (root == NULL) 
    { 
     printf("No elements in a tree to display"); 
     return; 
    } 

    if (t->l != NULL){ 
     print(t->l, (x + i), i, (y + 1)); 
    } 

    if (t->r != NULL){ 
     print(t->r, (x + i), i, (y + 1)); 
    } 
    gotoxy(x, y * 2); 
    printf("%d -> ", t->value); 
} 

如何我的任何想法可以實現樹輸出基於我當前的輸出代碼,但我認爲我需要做更多的事情,如果將其轉換爲樹狀。任何事情都會有所幫助,一個指導或一個想法真的會受到讚賞。

謝謝

+0

嘗試打印水平第一,這很容易。將縮進級別的信息傳遞給'print'函數,當然還可以打印縮進並用換行符結束打印格式。另外,應該在遞歸調用之間進行打印,而不是在遞歸調用之後進行打印。 –

+0

如果將35,41和50添加到數據集,您希望答案看起來像什麼。 –

+0

@Meehm,這有什麼用?假設你在「30」節點上,它不應該打印換行符,因爲「60」還沒有被處理。 –

回答

1

棘手的問題。讓我們先看一個更簡單的問題:如何水平打印樹,其根部向左,分支向右。這可以在不控制檯窗口的光標定位通過保持縮進級別的軌道來完成:

void horizontal(struct btnode *t, int level) 
{ 
    int l = level; 

    if (t == NULL) return; 

    horizontal(t->l, level + 1); 
    while (l--) printf(" "); 
    printf("-> %d\n", t->value); 
    horizontal(t->r, level + 1); 
} 

打印樹從上到下是相似的。縮進現在是頂部的位置。棘手的部分是如何向右推進打印。在簡單的控制檯示例中,通過打印新行來完成。在這裏,我們必須提前x的立場。這可以用一個全局變量x做,但你也可以保持狀態變量指出,在打印功能:

void print(struct btnode *nd, int *x, int y) 
{  
    if (nd == NULL) return; 

    print(nd->l, x, y + 4); 
    gotoxy(*x, y); 
    printf("%d", nd->value); 
    *x += 4; 
    print(nd->r, x, y + 4); 
} 

調用print功能是這樣的:

int x = 0; 
print(root, &x, 0); 
+0

感謝這:)你從哪裏得到nd? – magicianiam

+0

'nd'就是你在代碼中調用't'的地方 - 應該使用你的術語,對不起。當然,'nd'或't'的值在fisrt調用中是'root'。 (我在'print'中根本沒有使用'root',並且在函數內部檢查'NULL',根據你的邏輯,你總是必須對通話進行檢查,這樣做更好,因爲你節省了不必要的電話,但它也有潛在的危險,因爲客戶端代碼必須執行檢查。) –

+0

我明白了,再次感謝:)。無論如何,我是否有檢查樹的高度是否達到一定值? – magicianiam