打印二叉树中第m层第k个节点(递归+非递归)
来源:互联网 发布:封窗户 知乎 编辑:程序博客网 时间:2024/05/16 00:36
前面的文章中已经讨论过“ 层序遍历二叉树指定的某层”的问题,在这个基础上,对代码稍作修改,即可完成“打印二叉树中第m层第k个节点”,具体实现如下。
说明:根节点位于0层,每层中的第一个节点的下标为0;所以如果要打印二叉树中第m层第k个节点(需要传入的参数分别为:(m-1) 和 (k-1))。
#include <iostream>using namespace std;#include <vector>#include <deque>typedef struct node{ char data; struct node *lchild; struct node *rchild;}BiNode, *BiTree;// 先序建立二叉树 (输入时,按先序次序输入二叉树中结点的值,以 # 字符表示空树)BiTree createBiTree(){ BiTree T; char c; scanf("%c", &c); if (c == '#') T = NULL; else { T = new BiNode; // 或 T = (BiTree)malloc(sizeof(BiNode)); T->data = c; T->lchild = createBiTree(); T->rchild = createBiTree(); } return T;}// 递归,输出level层下标为k的节点。// 参数level代表几层(不是第几层),k代表该层中要访问的节点对应的下标;(如第3层,第2个节点 应传入参数(2, 1))int k = 1; // k=1 表示要访问level层的第2个节点int num = 0; // 初始化num,当访问到对应的level层时,num用于统计该层节点对应的下标,当num==k时,即找到目标节点。void PrintNodeAtLevel(BiTree T , int level){ if(T == NULL || level < 0) return; if(level == 0) { if (num == k) printf("%c\n", T->data); num++; } PrintNodeAtLevel(T->lchild , level - 1); PrintNodeAtLevel(T->rchild , level - 1);}// 非递归(一),此处借助vector来实现,输出level层下标为k的节点。// 参数level代表几层(不是第几层),k代表该层中要访问的节点对应的下标;(如第3层,第2个节点 应传入参数(2, 1))void printNodeAtLevel2(BiTree T, int level, int k) // 参数level代表几层(不是第几层){ if (T == NULL) return; vector<BiTree> vec; vec.push_back(T); int curLevel = 0; // 当前位于几层;(注意是几层,不是第几层;例如,根节点位于0层,即第1层) int cur = 0; int last = 1; while (cur < vec.size() && curLevel < level) { last = (int)vec.size(); while (cur < last) { if (vec[cur]->lchild) vec.push_back(vec[cur]->lchild); if (vec[cur]->rchild) vec.push_back(vec[cur]->rchild); cur++; } curLevel++; // 当前层数加1 } // 跳出上面的while循环时,curLevel == level;然后直接打印出当前层的下标位于[cur + k]的那个节点即可。 printf("%c\n", vec[cur + k]->data);}// 非递归(二),此处借助queue来实现,输出level层下标为k的节点。// 参数level代表几层(不是第几层),k代表该层中要访问的节点对应的下标;(如第3层,第2个节点 应传入参数(2, 1))void printNodeAtLevel3(BiTree T, int level, int k){ if(T == NULL) return; deque<BiTree> q; q.push_back(T); int curLevelNum; // 当前层的节点数 int curLevel = 0; // 当前位于几层 while (q.size() && curLevel < level) { curLevelNum = (int)q.size(); // 此处要做类型转换,因为size()返回值为size_type类型; while(curLevelNum-- > 0) // 一直访问到当前层的最后一个节点 { BiTree tmp = q.front(); q.pop_front(); if(tmp->lchild) q.push_back(tmp->lchild); if(tmp->rchild) q.push_back(tmp->rchild); } curLevel++; // 当前层数加1 } // 跳出上面的while循环时,curLevel == level;然后直接打印出当前层的下标是k的那个节点即可。 printf("%c\n", q[k]->data);}int main(int argc, const char * argv[]) { BiTree T = createBiTree(); // 建立 PrintNodeAtLevel(T, 2); // 递归输出(第3层第2个节点)(注意:访问第几个节点,实在上面int k = 1处指定的)// printNodeAtLevel2(T, 2, 1); // 非递归//// printNodeAtLevel3(T, 2, 1); // 非递归 return 0;}
1 0
- 打印二叉树中第m层第k个节点(递归+非递归)
- 二叉树(9)----打印二叉树中第K层的第M个节点,非递归算法
- 二叉树第K层的第M个节点 -- 采用非递归层次遍历实现
- 二叉树第K层节点个数 -- 采用递归和非递归方法
- 二叉树第K层叶子节点个数 -- 采用递归和非递归方法实现
- 求非完全二叉树第m层第k个节点
- 求非完全二叉树第m层第k个节点
- 百度笔试题:求非完全二叉树第m层第k个节点
- 二叉树(8)----求二叉树第K层的节点数和二叉树第K层的叶子节点数,递归方式和非递归方式
- 二叉树m层的第k个节点
- 输出二叉树中第m层的第k个节点值
- 输出二叉树第 m 层的第 k 个节点值
- 输出二叉树中,第m层的第k个节点值
- 求二叉树叶子节点的个数/求二叉树第k层的节点个数(递归思想)
- 二叉树的递归实现(前序,中序,后序,层序,高度,叶子节点数,第k层节点数)
- 6_41_递归求出二叉树先序遍历第k个节点的元素的值
- 二叉树遍历(递归,非递归,层序)
- 二叉树的前、中、后序遍历(递归和非递归)、层序遍历、深度、叶子节点个数
- FICO总账余额相关的事务码
- Hive 的性能调优总结
- PHP和Android之间的通信
- HTTPS, SPDY和 HTTP/2性能的简单对比
- Quartz组件学习记录
- 打印二叉树中第m层第k个节点(递归+非递归)
- 布局与控件(八)-ListView知多少(下)ChoiceMode详解
- 使用AIDL
- java 中unsigned类型的转换
- According to TLD or attribute directive
- ECHART 设置图表颜色(随即取)
- POI
- android 让dialog显示在锁屏上方
- 从java bean配置初识spring 实现最简单的Helloworld