2012-12-04 38 views
0

我的BST具有稱爲pTree的根。它由宣稱:BST中的指針幫助C++

KnightTree* tree; 

現在我需要編寫一個新的指針指向根(這是「樹」在這種情況下)的功能,永不改變的事件,如果我使用ptree中= pTree-> pLeftChild;或pTree = pTree-> pRightChild; 之前我調用該函數下面我宣佈:

KnightTree* treeroot=tree; 

然後我調用該函數:

ReadNLR(tree,treeroot); 

和函數是這樣的:

void ReadNLR(KnightTree*&tree,KnightTree* treeroot) 
{ 
    if(tree !=NULL) 
    { 
     cout<<tree->key<<" is at the depth of "<<NodeDepth(treeroot,tree)<<endl; 
     cout<<treeroot->key<<endl; 
     ReadNLR(tree->pLeftChild,treeroot); 
     ReadNLR(tree->pRightChild,treeroot); 
    } 
} 

我的想法是做一個讀取NLR並讀取每個節點將打印出其深度。但是我在這裏遇到的問題是treeroot就像樹的副本一樣,所以深度始終爲1(如從節點到根的距離加1)。我如何從初始樹根聲明treeroot,即使樹更改也不會改變?謝謝你,併爲我的英語感到難過!

+1

請顯示您的'NodeDepth'功能。也不清楚爲什麼'ReadNLR'中的'tree'參數是一個參考。 – prazuber

回答

0

一目瞭然,您的代碼看起來不錯,只是沒有理由將樹參數作爲指針的引用。我的猜測是NodeDepth有什麼問題。一個建議是隻跟蹤級別,而不是重新計算它。你的函數,該函數樹的depth-first sweep,那麼應該是這樣的:

void ReadNLR(KnightTree* tree, int level) 
{ 
    if (tree == NULL) 
     return; 

    cout << tree->key << " is at the depth of " << level; 
    ReadNLR(tree->pLeftChild, level + 1); 
    ReadNLR(tree->pRightChild, level + 1); 
} 

你會通過調用ReadNLRroot0作爲參數開始打印過程。

您還可以使用隊列按級別打印樹級別 - 如果您仍需要幫助,我會盡快發佈。

+0

NodeDepth很好。我檢查了NodeDepth(樹,(樹 - > pRightChild) - > pRightChild);並且它可以正常工作。 –

+0

它適用於單個案件的事實不能保證它每次都能正常工作。 – Svalorzen

+0

哦,我知道了......當宣佈make it = new KnightTree();然後分配它=樹,它的工作原理:D 感謝您的幫助! –