数据结构教材中,提供了基于队列实现一个二叉树的非递归层次遍历算法。但对于一个任意二叉树,如果要查找其中任何一个节点所在的层次数,教科书中并没有给出基于层次遍历的非递归算法。鉴于层次遍历算法比较容易理解,因此本人基于层次遍历的非递归算法,进行适当改造修改,实现了二叉树中指定节点层次数定位的非递归层次遍历算法。

基本数据结构定义、操作与算法实现:

/*二叉树结构定于与相关算法*/

typedef struct BiNode

{

ElemType data;

struct BiNode *lChild, *rChild;

}BitTree, *pBT;

/*

建立二叉树。对于数值型数据,以输入-1安排对应的空指针;对于字符型数据,以输入空格符安排对应的空指针。

以数值型数据为例建立一棵二叉树的递归算法

*/

BitTree *CreBiTree(void)

{

BitTree *bt;

ElemType x;

scanf_s(“%d”, &x);

if (x == -1) bt = NULL;

else

{

bt = (BitTree *)malloc(sizeof(BitTree));

bt->data = x;

bt->lChild = CreBiTree();

bt->rChild = CreBiTree();

}

return bt;

}

/*

建立用来操作二叉树节点的队列

队列的数据结构表示与实现,使用链队列形式

包括操作:初始化,取队长,判断队空,取队头元素,入队和出队

*/

typedef struct qBtNode{

BitTree btData;

struct qBtNode *next;

}qBtLink;

typedef struct{

qBtLink *front;

qBtLink *rear;

}LinkBtQueue;

void initBtQueue(LinkBtQueue *LQ)

{

LQ->front = LQ->rear = (LinkBtQueue *)malloc(sizeof(LinkBtQueue));

LQ->front->next = NULL;

}

int isEmptyBtQue(LinkBtQueue *LQ)

{

if (LQ->front == LQ->rear) return 1;

return 0;

}

void enBtQueue(LinkBtQueue *LQ, BitTree *btNode)

{

qBtLink *p;

p = (qBtLink *)malloc(sizeof(qBtLink));

p->btData = *btNode;

p->next = NULL;

if (LQ->front == NULL) LQ->front->next = p;

LQ->rear->next = p;

LQ->rear = p;

}

int outBtQueue(LinkBtQueue *LQ, BitTree *btNode)

{

qBtLink *p;

if (LQ->front == LQ->rear) return 0;

p = LQ->front->next;

*btNode = p->btData;

LQ->front->next = p->next;

if (LQ->rear == p)//队列中只有一个元素时,需要重新修改队尾指针

LQ->rear=LQ->front;

free(p);

return 1;

}

/*

以层次遍历的非递归方法,实现指定节点值的层次数定位

已知一棵二叉树以二叉链表结构存储,试编制算法计算给定结点所在的层次

*/

int NonRecurlevelBT(pBT bt, ElemType x)

{

LinkBtQueue lQ1,lQ2;

//使用两个队列,一个出队,如果有左右子树就入另一个队,当前面队列为空时,然后对另一个队出队处理,循环处理同前

int iLevel=0,isFind=0,isLoop;//iLevel用来保存层次数值,isFind用来标记是否找到,isLoop用来标志是否进入循环(一个队列处理循环代表一个树的一层)

BitTree p;

initBtQueue(&lQ1);

initBtQueue(&lQ2);

if (bt)

enBtQueue(&lQ1, bt);

iLevel = 0;

while (!isFind && (!isEmptyBtQue(&lQ1) || !isEmptyBtQue(&lQ2)))

{

while (!isFind && !isEmptyBtQue(&lQ1))

{

isLoop = 1;

outBtQueue(&lQ1, &p);

if (p.data == x)

{

isFind = 1;

break;

}

if (p.lChild) enBtQueue(&lQ2, p.lChild);

if (p.rChild) enBtQueue(&lQ2, p.rChild);

}

if (isLoop) { iLevel++; isLoop = 0; }

while (!isFind && !isEmptyBtQue(&lQ2))

{

isLoop = 1;

outBtQueue(&lQ2, &p);

if (p.data == x)

{

isFind = 1;

break;

}

if (p.lChild) enBtQueue(&lQ1, p.lChild);

if (p.rChild) enBtQueue(&lQ1, p.rChild);

}

if (isLoop) { iLevel++; isLoop = 0; }

}

if (isFind) return iLevel;

else return 0;

}

查找树的指定层级_非递归层次遍历方法实现二叉树中指定节点的层次数查找相关推荐

  1. 二叉树的三种遍历(递归与非递归) + 层次遍历

    <转载于  >>> > 二叉树是一种非常重要的数据结构,很多其他数据机构都是基于二叉树的基础演变过来的.二叉树有前.中.后三种遍历方式,因为树的本身就是用递归定义的,因此 ...

  2. 非递归,不用栈实现二叉树中序遍历

    最近总有人问这个问题:"如何不用栈,也不用递归来实现二叉树的中序遍历".这个问题的实现就是迭代器问题,无论是Java还是C++,利用迭代器遍历树节点(Java中是TreeMap类, ...

  3. java实现递归层次遍历_Java实现二叉树的前序、中序、后序、层序遍历(递归方法)...

    在数据结构中,二叉树是树中我们见得最多的,二叉查找树可以加速我们查找的效率,那么输出一个二叉树也变得尤为重要了. 二叉树的遍历方法分为四种,分别为前序遍历.中序遍历.后序.层序遍历.下图即为一个二叉树 ...

  4. C++ 实现二叉树的非递归层次遍历(队列实现)

    代码如下: void BinaryTree::LevelOrder(BinTreeNode *cur) {if (cur == NULL)return ;queue<BinTreeNode *& ...

  5. 实现一个二叉树层级遍历_算法总结:左神class5—二叉树递归和非递归实现遍历(后序用一个栈彩蛋)...

    二叉树类型的题目为常考题型 1.能够结合队列.栈.链表.字符串等很多数据结构. 2.需要掌握图的基本遍历方式,比如BFS和DFS. 3.需要掌握递归函数的使用,并自己设计出递归过程. 4.与实际工作结 ...

  6. 数据结构_非递归遍历二叉树(C语言)

    数据结构总目录 非递归遍历二叉树 1. 图文解析 对于链式二叉树,如果要用非递归的方式进行前.中.后序遍历,则需要借助一个栈实现,而层序遍历则需要借助队列来实现. 构建如下二叉树: 非递归先序遍历 ( ...

  7. 二叉树遍历详解(递归遍历、非递归栈遍历,Morris遍历)

    一.前言 <二叉查找树全面详细介绍>中讲解了二叉树操作:搜索(查找).遍历.插入.删除.其中遍历深度优先遍历(DFS)按照实现方法可以分为:递归遍历实现.非递归遍历实现.Morris遍历实 ...

  8. c语言中fact函数怎么调用,C语言程序题: 1、编写一个求n!的函数fact(n),要求fact函数分别用递归和非递归两种方法实现...

    点击查看C语言程序题: 1.编写一个求n!的函数fact(n),要求fact函数分别用递归和非递归两种方法实现具体信息 答:int fac(int n) //非递归{int f=1; for(;n;) ...

  9. 二叉树的几种递归和非递归式遍历:

    二叉树的几种递归和非递归式遍历: 1 #include <fstream> 2 #include <iostream> 3 4 using namespace std; 5 6 ...

最新文章

  1. 疯狂java讲义之流程控制与数组
  2. C#中Console.ReadKey()与ConsoleKey的一些用法
  3. JS 原型对象(prototype)
  4. React Native工程修改Android包名
  5. Sinclair 的ZX Spectrum 年逾三十
  6. k8s删除deployment_VPGAME k8s迁移实践(5) Deployment 与 Service 配置
  7. “System.InvalidOperationException”类型的未经处理的异常在 ESRI.ArcGIS.AxControls.dll 中发生...
  8. mybatis的javaType和ofType
  9. MySQL开发医药管理系统_医药管理系统struts+hibernat+mySql,内含需求分析,详细设计文档...
  10. LinUX接收蓝牙音频,Win10 v2004已重新支持蓝牙A2DP音频串流接收功能
  11. 企业微信公众号怎么运营管理?
  12. linux服务器什么意思,linux中的“/”和“./”是什么意思
  13. Java - LinkedHashMap(有序 map)获取第一个元素和最后一个元素
  14. 我们为什么要结婚?(
  15. 计算机科学导论第三版——第一章课后习题(贝赫鲁兹·佛罗赞BehrouzForouzan)(渐水问个人答案笔记csdn)
  16. 数据结构实验课:实验五、二叉树操作及应用
  17. 什么是 SSH 以及常见 ssh 用法
  18. 【分隔结构】动宾分离
  19. Java 贪吃蛇游戏引言
  20. 第一次看母亲细嚼慢咽地吃饭,欣慰还是心酸?

热门文章

  1. 安装Ubuntu 12.04
  2. 杭电2073无限的路.水题
  3. PHP window2003服务和2008服务器上传个别文件访问报错
  4. 3d激光雷达开发(旋转和位移)
  5. 随想录(vc仿真下的嵌入式开发)
  6. jsp调用java的数据库连接,初学jsp,javabean连接数据库调用总是报错,疯了,求大神解决方案...
  7. kis显示用户登录服务器失败,金蝶KIS专业版提示用户KISAdmin登陆失败。原因:未与信任SQL Server连接相关联...
  8. socket.io php 聊天室,WebSocket学习(一)——基于socket.io实现简单多人聊天室
  9. java 简单阻塞队列,制作一个简单的任务队列(使用阻塞队列)
  10. mybatis select 返回值long null_Mybatis框架(二)