题目描述:
求二叉树叶子节点的个数/求二叉树第k层的节点个数
思路:
这两个题目的思想类似,都是利用二叉树的自相似性,把每次传进来的节点看做是一个二叉树的根结点。将问题细化,将每个节点的状态信息返回即可。
节点以及二叉树信息:
template <typename T>
struct BinaryTreeNode
{
BinaryTreeNode(const T& data)
:m_data(data)
, m_pLeft(nullptr)
, m_pRight(nullptr)
{}
T m_data;
BinaryTreeNode<T>* m_pLeft;//左孩子
BinaryTreeNode<T>* m_pRight;//右孩子
};
template <typename T>
class BinaryTree
{
typedef BinaryTreeNode<T> Node;
public:
BinaryTree()//无参构造函数
:m_pRoot(nullptr)
{}
//将成员函数的实现进行简单的封装,用户只能显示调用公共接口
size_t GetLeefNode()//获取叶子结点个数
{
return _GetLeefNode(m_pRoot);
}
size_t GetKLevelNode(size_t k)//获取某一层结点个数
{
return _GetKLevelNode(m_pRoot, k);
}
private:
_GetLeefNode(Node* pRoot)//递归实现:获取叶子结点个数
_GetKLevelNode(Node* pRoot, size_t k)//递归实现:获取某一层结点个数
private:
BinaryTreeNode<T>* m_pRoot;//根结点
};
求二叉树叶子节点的个数
实现代码:
template <typename T>
size_t BinaryTree<T>::_GetLeefNode(Node* pRoot)//递归实现:获取叶子结点个数
{
if (nullptr == pRoot)//空树或空结点
return 0;
if ((nullptr == pRoot->m_pLeft) && (nullptr == pRoot->m_pRight))//当前节点时叶子结点
return 1;
//以上两个判断语句是递归出口
//利用递归,获取左右子树的叶子结点个数
size_t leaves_left = _GetLeefNode(pRoot->m_pLeft);//获取左子树叶子结点数
size_t leaves_right = _GetLeefNode(pRoot->m_pRight);//获取右子树叶子结点数
return leaves_left + leaves_right;//返回左右子树叶子结点之和
}
求二叉树第k层的节点个数
实现代码:
template <typename T>
size_t BinaryTree<T>::_GetKLevelNode(Node* pRoot, size_t k)//递归实现:获取某一层结点个数
{
if ((nullptr == pRoot) || (1 > k))//空树或空结点、k小于1
return 0;
if (1 == k)//k=1表示当前结点
return 1;
//以上两个判断语句是递归出口
//利用递归,获取左右子树中处于k-1层结点个数
size_t nodes_left = _GetKLevelNode(pRoot->m_pLeft, k - 1);//获取左子树中k-1层结点个数
size_t nodes_right = _GetKLevelNode(pRoot->m_pRight, k - 1);//获取右子树中k-1层结点个数
return nodes_left + nodes_right;
}