2015-04-06 164 views
0

我在BST根和頂端使用了兩個指針。頂部指針沿着樹移動以供插入和顯示。現在我的問題是在我的順序代碼中。我移動上面的指針沿樹向下,直到時間NULL通過遞推找到如下樹二叉搜索樹中序樹顯示

void display() 
{ 

    if(top->left!=NULL) 
    { 
     top=top->left; 
     display(); 
    } 

    cout<<"\n\nnow the address of top is "<<top; 
    return; 
} 

元件是用於暫時12 11和10;現在在函數的最後遞歸調用中,頂部指針在10處移動,但如何在最後一個函數之後將頂部指針移回;在每個cout中top的地址是10意味着即使控制回到先前的遞歸函數,指針仍然保持在10。在這段代碼中有兩個遞歸函數,顯示稱爲兩次,在第二個顯示函數之後,頂部指針不會向上移動樹,而是保持在10,我想在每次遞歸顯示函數完成後移回頂部指針。幫幫我。但不涉及顯示功能中的自變量。

+1

_「但不涉及顯示函數中的自變量」_ **爲什麼?!?** –

+1

由於您沒有任何指向父節點的鏈接,因此您必須使用「堆棧」來推送在遍歷到子樹或節點之前的當前節點位置。 –

回答

1

在這個示例中,您的代碼似乎正在逐步向左(每個樹的右側)(但忽略右側)。

if(top->left!=NULL) 
{ 
    top=top->left; 
    display(); 
} 

一般來說,BST有節點,每個節點都有數據,一個ptr給左孩子,一個ptr給右孩子。

而且看起來你的節點還沒有包含「display()」方法。


在樹上,我懷疑你想被調用

<a node> -> display(); 

爲避免在遞歸「顯示」傳遞指針調用。

接下來,你的名字是誤導(對我來說)。所以也許如果你重新命名一些東西,下面的內容可能適合你,而且更易於理解。

每個節點至少需要3個部分和顯示方法。對於深度優先搜索,在線顯示可能會引發一些想法。

Node::display(void) 
{ 
    // first, display nodes of left side-of-tree 
    if(nullptr != left) 
    { 
     left->display(); 
    } 
    // else no left node available 


    // for in-order, cout the data at this node 
    std::cout << data << std::endl; 


    // continue the depth-first display by tracing the right side 
    if (nullptr != right) 
    { 
     right->display(); 
    } 
} 

要開始顯示軌跡,您需要有一個樹的錨點。也許是這樣的:

Tree::display() 
{ 
    if(tree.Top) // is tree not empty? 
     tree.Top->display(); 
    ... 

所以...我建議對樹類,其他類節點,爲樹,節點的顯示方法的顯示方法等

希望這有助於。 .. 祝你好運。