打印二叉树中第m层第k个节点(递归+非递归)
2016-06-03 16:10
246 查看
前面的文章中已经讨论过“ 层序遍历二叉树指定的某层”的问题,在这个基础上,对代码稍作修改,即可完成“打印二叉树中第m层第k个节点”,具体实现如下。
说明:根节点位于0层,每层中的第一个节点的下标为0;所以如果要打印二叉树中第m层第k个节点(需要传入的参数分别为:(m-1) 和 (k-1))。
说明:根节点位于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; }
相关文章推荐
- AVL树-自平衡二叉查找树(Java实现)
- 有关数据库SQL递归查询在不同数据库中的实现方法
- C#中的递归APS和CPS模式详解
- WinForm实现按名称递归查找控件的方法
- 使用SqlServer CTE递归查询处理树、图和层次结构
- C#中的尾递归与Continuation详解
- C语言二叉树的非递归遍历实例分析
- 使用C语言构建基本的二叉树数据结构
- 一波二叉树遍历问题的C++解答实例分享
- C#递归实现显示文件夹及所有文件并计算其大小的方法
- 举例讲解C语言程序中对二叉树数据结构的各种遍历方式
- C++非递归队列实现二叉树的广度优先遍历
- php递归创建目录的方法
- PHP实现的线索二叉树及二叉树遍历方法详解
- C#使用前序遍历、中序遍历和后序遍历打印二叉树的方法
- PHP递归创建多级目录
- Javascript递归打印Document层次关系实例分析
- C++使用递归方法求n阶勒让德多项式完整实例
- oracle 使用递归的性能提示测试对比
- 使用curl递归下载软件脚本分享