二叉树第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
- 二叉树第K层节点个数 -- 采用递归和非递归方法
- 二叉树第K层叶子节点个数 -- 采用递归和非递归方法实现
- 二叉树第K层的第M个节点 -- 采用非递归层次遍历实现
- 二叉树叶子节点个数计算 -- 采用递归和非递归方法实现
- 二叉树----节点个数、高度、递归和非递归遍历、按层遍历
- 二叉树----节点个数、高度、递归和非递归遍历、按层遍历
- 求二叉树叶子节点的个数/求二叉树第k层的节点个数(递归思想)
- 求二叉树节点数 -- 采用递归和非递归方法
- 二叉树(8)----求二叉树第K层的节点数和二叉树第K层的叶子节点数,递归方式和非递归方式
- 分别采用递归和非递归方式编写两个函数,求一棵二叉树中叶子节点个数
- 打印二叉树中第m层第k个节点(递归+非递归)
- 二叉树的前、中、后序遍历(递归和非递归)、层序遍历、深度、叶子节点个数
- 二叉树的节点个数和深度(非递归)
- 二叉树非递归求深度和节点个数
- 二叉树(9)----打印二叉树中第K层的第M个节点,非递归算法
- 二叉树(7)----求二叉树叶子节点个数,递归和非递归
- 求二叉树镜像 -- 采用递归和非递归方法
- 二叉树中叶子节点的个数(非递归)
- 微信防盗链处理
- 逻辑与和逻辑或运算符返回值
- 基于nginx tomcat redis分布式web应用的session共享配置
- 默认建立的myeclipse web工程无法运行
- [转载]spark算子介绍
- 二叉树第K层节点个数 -- 采用递归和非递归方法
- C语言中可变参数的用法
- php base64图片上传
- Java数字转字符串前面自动补0的实现
- ListView属性总结~让你的条目更美观
- Asp.net mvc 数据处理学前概念
- leetCode 28 Implement strStr()
- 傻瓜式一键发布
- 【原创】k8s源码分析-----kube-proxy(1)Config