二叉树第K层节点个数 -- 采用递归和非递归方法

来源:互联网 发布:淘宝qq三国游戏币 编辑:程序博客网 时间:2024/06/05 03:08
/*二叉树第k层节点个数 -- 采用递归和非递归方法经调试可运行源码及分析如下:***/#include <stdlib.h>#include <iostream>#include <queue>using std::cout;using std::cin;using std::endl;using std::queue;/*二叉树结点定义*/typedef struct BTreeNode{    char elem;    struct BTreeNode *pleft;    struct BTreeNode *pright;}BTreeNode;/*求二叉树第k层的节点数递归方式步骤:给定根节点proot:如果proot为空,或者层数k_Level <= 0,则为空树或者不合要求,则返回0;如果proot不为空,且此时层数 k_Level==1,则此时proot为第K层节点之一,则返回1;如果proot不为空,且此时层数 k_Level > 1,则此时需要求proot左子树(k_Level - 1 )层节点数和proot右子树(k_Level-1)层节点数;/*递归实现求二叉树第k层的节点数*/int get_k_level_number(BTreeNode *proot, int k){    if(proot == NULL || k <= 0)        return 0;    if(proot != NULL && k == 1)        return 1;    return (get_k_level_number(proot->pleft, k-1) +            get_k_level_number(proot->pright, k-1));}/*非递归:按层次遍历找到第k层,借助队列实现。 **//*非递归实现求二叉树第k层的节点数*/int get_k_level_number_bylevelorder(BTreeNode* proot, int k){    if(proot == NULL || k == 0)        return 0;    int cur_level_size = 0;//当前层的节点个数    int cur_level = 0;  //当前层数    queue <BTreeNode*> que;    que.push(proot);    while (!que.empty())    {        ++cur_level;        cur_level_size = que.size();        if(cur_level == k)//当到第k层时            break;        int temp_count = 0;        //当前层的所有节点出队,下一层的结点入队        while (temp_count < cur_level_size)         {            ++temp_count;            proot = que.front();            que.pop();            if (proot->pleft != NULL)                que.push(proot->pleft);            if (proot->pright != NULL)                que.push(proot->pright);        }           }    while(!que.empty())        que.pop();//清空队列    if(cur_level == k)        return cur_level_size;    return 0;}/*初始化二叉树节点*/BTreeNode* btree_init(BTreeNode* &bt){    bt = NULL;    return bt;}/*先序创建二叉树*/void pre_crt_tree(BTreeNode* &bt){    char ch;    cin >> ch;    if (ch == '#')    {        bt = NULL;    }    else    {        bt = new BTreeNode;        bt->elem = ch;        pre_crt_tree(bt->pleft);        pre_crt_tree(bt->pright);    }}int main(){    int k_level_num = 0;    int k;    BTreeNode *bt;    btree_init(bt);//初始化根节点    pre_crt_tree(bt);//创建二叉树    cout << "请输入层数k:"  << endl;    cin >> k;    cout << "递归遍历结果:" << endl;    k_level_num = get_k_level_number(bt, k);    cout << "第" << k << "层的节点个数为:" << k_level_num << endl;    cout << "非递归遍历结果:" << endl;    k_level_num = get_k_level_number_bylevelorder(bt, k);    cout << "第" << k << "层的节点个数为:" << k_level_num << endl;    system("pause");    return 0;}/*运行结果:a b c # # # d e # # f # g # #请输入层数k:3---以上为输入------以下为输出---递归遍历结果:第3层的节点个数为:3非递归遍历结果:第3层的节点个数为:3请按任意键继续. . .本例创建的二叉树形状:        a    b       d   c         e   f             g参考资料:http://blog.csdn.net/beitiandijun/article/details/41941211http://yuncode.net/code/c_505ea04f8f6186*/
0 0
原创粉丝点击