求二叉树叶子节点的个数/求二叉树第k层的节点个数(递归思想)

//1.【基础题】--求二叉树叶子节点的个数/求二叉树第k层的节点个数。 
#include<iostream>
#include<cassert>
using namespace std;
template<typename T>
struct  TreeNode
{
    T data;
    TreeNode<T>* left;
    TreeNode<T>* right;
    TreeNode(const T& x)
        :data(x)
        ,left(NULL)
        ,right(NULL)
    {}
};

template<typename T>
class BinaryTree
{
    typedef TreeNode<T> Node;
public:
    BinaryTree(const T* arr,const T& invalib,int sz)//arr为存放数的元素值得数组,invalib 为非法值,sz为数组的元素个数
    {
       assert(arr);
       int index=0;
       _root=CreatTree(arr,invalib,sz,index);
    }
    int GetLeafNodeNumber()//求二叉树叶子节点的个数
    {
        return _GetLeafNodeNumber(_root);
    }
    int Get_K_NodeNumber(int k)//求二叉树第k层的结点数
    {
        return _Get_K_NodeNumber(_root,k);
    }
protected:


----------


    Node* CreatTree(const T* arr,const T& invalib,int sz,int& index)//前序遍历二叉树
    {
        assert(arr);
        Node* root=NULL;
        while (index<sz&&arr[index]!=invalib)
        {
            root=new Node(arr[index]);
            root->left=CreatTree(arr,invalib,sz,++index);
            root->right=CreatTree(arr,invalib,sz,++index);
        }
        return root;
    }



----------


----------
int _GetLeafNodeNumber(Node* root)//求二叉树的叶子节点
    {
        //1.树为空,二叉树节点个数为0
        if (root==NULL)
        {
            return 0;
        }
        //2.树不为空,且树只有一个结点,二叉树的节点个数为1
        if (root->left==NULL&&root->right==NULL)
        {
            return 1;
        }
        //3.树不为空,且树的节点个数大于1;则树的结点个数=当前左子树的节点个数+当前右子树的节点个数
        return _GetLeafNodeNumber(root->left)+_GetLeafNodeNumber(root->right);
    }



----------


----------


    int _Get_K_NodeNumber(Node* root ,int k)//求二叉树第K层的结点个数
    {
        //1.首先断言层数K>0
        assert(k>0);
        //2.树为空,二叉树每层的节点个数都为0
        if (root==NULL)
        {
            return 0;
        }
        //3.树不为空,层数为1,第一层的节点个数为1;
        if (k==1)
        {
            return 1;
        }
        //4.树不为空,层数大于1,则第k层的节点个数=当前跟结点的左子树的k-1层的节点个数+当前跟结点的右子树的k-1层的结点个数;
        return  _Get_K_NodeNumber(root->left,k-1)+_Get_K_NodeNumber(root->right,k-1);
    }

----------


    protected:
    Node* _root;
};

int main()
{
    int arr[]={1,2,3,'#','#',4,'#','#',5,6,'#','#','#'};
    int sz=sizeof(arr)/sizeof(arr[0]);
    BinaryTree<int>  bt(arr,'#',sz);
    cout<<"叶子节点个数:"<<bt.GetLeafNodeNumber()<<endl;//3
    cout<<"第一层节点数:"<<bt.Get_K_NodeNumber(1)<<endl;//1
    cout<<"第二层节点数:"<<bt.Get_K_NodeNumber(2)<<endl;//2
    cout<<"第三层节点数:"<<bt.Get_K_NodeNumber(3)<<endl;//3
    return 0;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值