2017-11-07 2 views
0

저는 이진 트리의 잎수를 0으로 늘 렸습니다. 내 코드에 어떤 문제도 보이지 않으며 약간의 피드백을 원합니다. 감사합니다! :)이진 트리 코드의 잎 수를 얻으려면 어떻게해야합니까?

MAIN.CPP

int main() 
{ 
    BinaryTree <int> a; 
    a.insertNode(13); 
    a.insertNode(28); 
    a.insertNode(8); 
    a.insertNode(14); 
    cout << a.numNodes() << endl; 
    cout << a.numLeafNodes() << endl; 
    cout << a.height() << endl; 
    cout << a.getWidth() << endl; 
    system("PAUSE"); 
} 

이진 트리 클래스 헤더. 이것은 함수가있는 클래스입니다.

template<class T> 
class BinaryTree 
    { 
private: 
    struct TreeNode 
    { 
     T value; 
     TreeNode *left; 
     TreeNode *right; 
    }; 

    TreeNode *root; 

    void insert(TreeNode *&, TreeNode *&); 
    int countNodes(TreeNode *&nodePtr); 
    void countLeaves(TreeNode* nodePtr); 
    int getTreeHeight(TreeNode* nodePtr); 
    int width(TreeNode* nodePtr); 
public: 
    BinaryTree() 
    { 
     root = nullptr; 
    } 

    void insertNode(T); 
    int numNodes(); 
    int numLeafNodes(); 
    int height(); 
    int getWidth(); 
}; 

내 잎 수를 얻기위한 함수. 문제가 확실하지 않은 곳입니다.

template <class T> 
int BinaryTree<T>::numLeafNodes() 
{ 
    int leafCount = 0; 
    countLeaves(root); 
    return leafCount; 
} 

template <class T> 
void BinaryTree<T>::countLeaves(TreeNode* nodePtr) 
{ 
    if (nodePtr) 
    { 

     countLeaves(nodePtr->left); 
     countLeaves(nodePtr->right); 
     if (nodePtr->left == NULL && nodePtr->right == NULL) 
     { 
      int leafCount = 0; 
      leafCount = leafCount + 1; 
     } 
    } 
} 

답변

1
template <class T> 
int BinaryTree<T>::numLeafNodes() 
{ 
    int leafCount = 0; 

leafCount라는 변수를 정의합니다.

countLeaves(root); 

위에서 정의한 leafCount은 변경되지 않습니다.

return leafCount; 

... 그래서 이것은 여전히 ​​값 0을 잡고, leafCount을 반환합니다. 이것은 또 다른 정의

template <class T> 
void BinaryTree<T>::countLeaves(TreeNode* nodePtr) 
{ 
    if (nodePtr) 
    { 

     countLeaves(nodePtr->left); 
     countLeaves(nodePtr->right); 
     if (nodePtr->left == NULL && nodePtr->right == NULL) 
     { 
      int leafCount = 0; 

도 발생 완전히 분리 된 변수는 leafCount 명명한다.

  leafCount = leafCount + 1; 

이 값은 바로 위에 정의 된 변수를 증가시킵니다.

 } 

... 그리고 여기 leafCountleafCount에서 관측 효과가 생성 증가, 또는 파괴가 없기 때문에 (그리고, 기회는 범위를 벗어나 모두에서 그 범위 밖에서 아무 영향을주지 않고, 파괴 컴파일러는 모든 것을 최적화 할 것이다).

일반적으로 원하는 것은 리프 노드가 발생하는 횟수를 나타내는 값을 반환하는 것과 같습니다. 이것은 현재 노드가 리프 노드인지 여부를 판별하고, 그렇지 않으면 1을 리턴합니다. 그렇지 않으면, 왼쪽 및 오른쪽 서브 트리의 리프 노드 수의 합계를 리턴합니다.

+0

일부 항목이 변경되었지만 여전히 작동하지 않습니다. 오류 메시지가 나타나지 않고 컴파일이 끝나는 중간에 멈추고 처리되지 않은 예외 메시지가 표시됩니다. –

관련 문제