2012-11-30 40 views

回答

2

遞歸二叉樹遍歷基本上(如果僞代碼,這是課程):

def traverse (node): 
    if (node == NULL): 
     return 
    traverse (node.left) 
    doSomethingWith (node.payload) 
    traverse (node.right) 
: 
traverse (root) 

這一切就是真的,只是任何你想做的事更換doSomethingWith()(如打印)。

這將按照從左到右的順序進行遍歷,因此,如果您的BST按照左移意味着更低的順序進行排序,則只需調用兩個traverse調用即可。

舉例來說,考慮下面的樹:

 20 
    /\ 
    10 25 
/ /\ 
    5 24 27 
/  /
2   28 

體現在這個例子中的C程序:

#include <stdio.h> 

typedef struct s { 
    int payload; 
    int left; 
    int right; 
} tNode; 

tNode node[] = { // Trust me, this is the tree from above :-) 
    {20, 1, 4}, {10, 2, -1}, { 5, 3, -1}, { 2, -1, -1}, 
    {25, 5, 6}, {24, -1, -1}, {27, -1, 7}, {28, -1, -1}}; 

static void traverse (int idx) { 
    if (idx == -1) return; 
    traverse (node[idx].right); 
    printf ("%d ", node[idx].payload); 
    traverse (node[idx].left); 
} 

int main (void) { 
    traverse (0); 
    putchar ('\n'); 
    return 0; 
} 

運行該程序爲您提供了以下的輸出:

28 27 25 24 20 10 5 2 
+0

@Roger,反向中序遍歷,就像我所說的那樣,交換遍歷調用。或者你有最高和最低的其他定義?如果是這樣,您需要與我們分享這些信息。 – paxdiablo

+0

我以前用過這個方法,但是我不能得到正確的訂單 –

+0

@Roger,那代碼肯定會產生反向排序的節點。這是你想要的順序嗎? – paxdiablo

0

當然。假設BST進行排序,使得「大於」節點是在右邊,「小於」的節點是在左邊,這樣的遞歸函數將工作:

void recurse(Node* node) 
{ 
    if (node == nullptr) return; 
    recurse(node->right); // Explore all the "greater than" nodes first 
    std::cout << node->value << std::endl; // Then print the value 
    recurse(node->left); // Then explore "less than" nodes 
} 
+0

我試過這個,但它似乎不正確。 –

+0

@RogerZhu:定義「似乎不對」。 – Cornstalks

+0

對不起,該方法是正確的。在之前的編程中,我自己在程序中犯了錯誤。謝謝。 –

相關問題