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


    /*二叉树第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/41941211
    http://yuncode.net/code/c_505ea04f8f6186
    */
    ---------------------
    作者:lesliefish
    来源:CSDN
    原文:https://blog.csdn.net/y396397735/article/details/51152182
    版权声明:本文为博主原创文章,转载请附上博文链接!

  • 相关阅读:
    线程池的优雅关闭实践
    InheritableThreadLocal原理解析
    线程池踩坑
    两个线程通讯(生产-卖面包问题)
    谈谈redis的热key问题如何解决
    中国软件杯选题A1数据智能分析报告系统
    《程序员的思维修炼》读后感
    《算法导论》读后感
    《重构》读后感
    《代码整洁之道》读后感
  • 原文地址:https://www.cnblogs.com/stone531/p/10518777.html
Copyright © 2020-2023  润新知