2012-12-04 3 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가 tree의 복사본처럼 보이고 깊이가 항상 같기 때문에 (노드에서 루트에 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); 
} 

당신은 인수로 rootReadNLR0를 호출하여 인쇄 프로세스를 시작합니다.

큐를 사용하여 수준별로 트리 수준을 인쇄 할 수도 있습니다. 도움이 필요한 경우 곧 게시 할 예정입니다.

+0

NodeDepth가 좋습니다. 나는 NodeDepth (tree, (tree-> pRightChild) -> pRightChild)로 체크했다; 제대로 작동합니다. –

+0

단일 케이스에서 작동한다는 사실은 매번 작동한다는 것을 보장하지 않습니다. – Svalorzen

+0

아, 알아 냈습니다 ... 선언 할 때 새로운 = KnightTree(); 그것을 할당 = 트리 및 그것을 작동합니다 : D 모두를 도와 주셔서 감사합니다! –