如何获取二叉树代码中的叶数?

时间:2017-11-07 01:27:20

标签: c++ binary-tree

我的二叉树上的叶数已经变为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 个答案:

答案 0 :(得分:0)

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

这定义了一个名为leafCount的变量。

countLeaves(root);

这不会改变上面定义的leafCount

return leafCount;

...所以这会返回leafCount,仍然保持值0

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;

这会增加上面定义的变量。

        }

...这里leafCount超出范围并被销毁,而不会影响其范围之外的任何内容(因为这个leafCount没有被创建,增加或者没有可观察到的影响被破坏的机会是编译器将优化所有这些。)

您通常想要的是返回一个值,该值指示遇到的叶节点数。这将判断当前节点是否为叶节点,如果是,则返回1.否则,它将返回其左右子树的叶节点数的总和。