判断叶子结点的个数

来源:互联网 发布:美发修改软件 编辑:程序博客网 时间:2024/04/29 00:33
template <class T>struct BinaryTreeNode//定义二叉树的节点{    BinaryTreeNode(const T& value)        :_value(value)        ,_pLeft(NULL)        ,_pRight(NULL)    {}    T _value;    BinaryTreeNode<T>* _pLeft;    BinaryTreeNode<T>* _pRight;};template<class T>class BinaryTree//定义二叉树{    typedef BinaryTreeNode<T> Node;public:    BinaryTree()        :_pRoot(NULL)    {}private:    Node* _pRoot;//根节点};

要知道一棵二叉树中叶子结点的个数,首先知道什么是叶子结点。
叶子结点:
左子树和右子树都为空的节点,所以是&&的关系。
下面使用递归遍历这棵树,其
返回值 = 左子树中叶子结点的个数 + 右子树中叶子结点的个数。

public:    size_t GetLeefCount()    {        return _GetLeefCount(_pRoot);    }private:    size_t _GetLeefCount(Node* pRoot)    {        if(pRoot == NULL)            return 0;        if(pRoot->_pLeft == NULL && pRoot->_pRight == NULL)            return 1;        return _GetLeefCount(pRoot->_pLeft) + _GetLeefCount(pRoot->_pRight);    }

查找第K层中,结点的个数:
用递归的方法遍历这棵树,递归出口就是:
当前节点为空或K<1或K>树的深度。任何一个条件成立都可以,是 || 的关系。

public:    size_t GetKLevelCount(size_t k)    {        return _GetKLevelCount(_pRoot, k);    }private:    size_t _GetKLevelCount(Node* pRoot, size_t k)    {        if(pRoot == NULL || k<1 || k>_BinaryTreeDepth(pRoot))            return 0;        if(k == 1)            return 1;        return _GetKLevelCount(pRoot->_pLeft, k-1) + _GetKLevelCount(pRoot->_pRight, k-1);    }
0 0