2014-02-26 91 views
0

我是C新手,我正在學習函數和指針。我必須在t_print方法中以下面必需的格式打印二進制搜索樹,我將非常感激一些人可以指導我如何去做。打印BST - C程序

我有這樣的代碼至今:

typedef struct tree { 
    void* data; 
    struct tree* left; 
    struct tree* right; 
} Tree; 


/*set the data on the tree node */ 
void t_set_data(Tree* t, void* data) { 
t->data = data;} 

/*let l be the left node of tree *t */ 
void t_set_left(Tree* t, Tree* l){ 
t->left = l;} 

/*let r be the left node of tree *t */ 
void t_set_right(Tree* t, Tree* r){ 
t->right = r;} 

/* simply return left node of the tree */ 
Tree* t_left(Tree* t){ 
    return t-> left;} 

/* simply return right node of the tree */ 
Tree* t_right(Tree* t){ 
    return t-> right;} 

/* simply return the data of the tree */ 
void* t_data(Tree* t){ 
    return t->data;} 

/* make the node of the tree and allocate space for it*/ 
Tree* t_make(){ 
    Tree *t = (Tree*)malloc(sizeof(tree)); 
    t->left=NULL; 
    t->right = NULL; 
    t-> data = NULL; 
    return t; 
    } 
/* 

print the whole tree in the following format 

Root is printed with zero trailing spaces to the left 
Every node/subtree is printed with one additional space 
Below is an example for a tree with depth 2: 

Root 
<space>Left-Child 
<space><space>Left-Left-Child 
<space><space>Left-Right-Child 
<space>Right-Child 
    .... and so on ... 


Use (void(* p))(function pointer) to print. 

*/ 
void t_print(Tree* t ,int space, void(* p)(void*)){ 
} 

回答

0

這取決於您要在其中數據印刷的順序,但「爲了」一個BST,是合適的(相對於預購或後順序)。

以「爲了」打印樹,該函數:

  • 如果當前節點不爲空
    • 打印左子樹爲了
    • 打印當前節點
    • 打印右子樹爲了

「按順序打印xxx子樹」操作是使用左指針或右指針遞歸調用「按順序打印」功能。

預購的算法是:

  • 如果當前節點不爲空
    • 打印當前節點
    • 打印左子樹預購
    • 打印正確的子樹在預購

爲後序的算法是:

  • 如果當前節點不爲空
    • 打印左子樹後序
    • 打印右子樹後,爲了
    • 打印當前節點

它真的就是這麼簡單。

好了,幾乎就這麼簡單......

如果你想括號中的數據或以其他方式能夠識別樹狀結構,你有工作有點困難。您通常最終還會添加一個封面函數,該函數會添加一個前綴(標識輸出的標記)和一個後綴(可能只是一個換行符);這通常不是遞歸打印的一部分。但算法的核心與描述一樣簡單。

+0

我應該按給出的t_print()方法的格式打印樹。 – user3267967

+0

好的;這是一個預訂打印 - 您打印節點,然後打印它的子節點。您還需要將級別參數傳遞給打印函數,以便在節點之前打印正確數量的空格。真的很簡單,只要你知道如何通過函數指針調用一個函數。既然你不能告訴打印函數指針要縮進多少個空格,你可能需要自己編寫這些代碼。 –

+0

它看起來像你正在編碼的規範;你的老師是否會提供調用你的代碼和打印函數的'main()'程序? –