17_7_22 求二叉树叶子节点的个数/求二叉树第k层的节点个数

题目描述:
求二叉树叶子节点的个数/求二叉树第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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值