查找树的指定层级_非递归层次遍历方法实现二叉树中指定节点的层次数查找
数据结构教材中,提供了基于队列实现一个二叉树的非递归层次遍历算法。但对于一个任意二叉树,如果要查找其中任何一个节点所在的层次数,教科书中并没有给出基于层次遍历的非递归算法。鉴于层次遍历算法比较容易理解,因此本人基于层次遍历的非递归算法,进行适当改造修改,实现了二叉树中指定节点层次数定位的非递归层次遍历算法。
基本数据结构定义、操作与算法实现:
/*二叉树结构定于与相关算法*/
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;
}
查找树的指定层级_非递归层次遍历方法实现二叉树中指定节点的层次数查找相关推荐
- 二叉树的三种遍历(递归与非递归) + 层次遍历
<转载于 >>> > 二叉树是一种非常重要的数据结构,很多其他数据机构都是基于二叉树的基础演变过来的.二叉树有前.中.后三种遍历方式,因为树的本身就是用递归定义的,因此 ...
- 非递归,不用栈实现二叉树中序遍历
最近总有人问这个问题:"如何不用栈,也不用递归来实现二叉树的中序遍历".这个问题的实现就是迭代器问题,无论是Java还是C++,利用迭代器遍历树节点(Java中是TreeMap类, ...
- java实现递归层次遍历_Java实现二叉树的前序、中序、后序、层序遍历(递归方法)...
在数据结构中,二叉树是树中我们见得最多的,二叉查找树可以加速我们查找的效率,那么输出一个二叉树也变得尤为重要了. 二叉树的遍历方法分为四种,分别为前序遍历.中序遍历.后序.层序遍历.下图即为一个二叉树 ...
- C++ 实现二叉树的非递归层次遍历(队列实现)
代码如下: void BinaryTree::LevelOrder(BinTreeNode *cur) {if (cur == NULL)return ;queue<BinTreeNode *& ...
- 实现一个二叉树层级遍历_算法总结:左神class5—二叉树递归和非递归实现遍历(后序用一个栈彩蛋)...
二叉树类型的题目为常考题型 1.能够结合队列.栈.链表.字符串等很多数据结构. 2.需要掌握图的基本遍历方式,比如BFS和DFS. 3.需要掌握递归函数的使用,并自己设计出递归过程. 4.与实际工作结 ...
- 数据结构_非递归遍历二叉树(C语言)
数据结构总目录 非递归遍历二叉树 1. 图文解析 对于链式二叉树,如果要用非递归的方式进行前.中.后序遍历,则需要借助一个栈实现,而层序遍历则需要借助队列来实现. 构建如下二叉树: 非递归先序遍历 ( ...
- 二叉树遍历详解(递归遍历、非递归栈遍历,Morris遍历)
一.前言 <二叉查找树全面详细介绍>中讲解了二叉树操作:搜索(查找).遍历.插入.删除.其中遍历深度优先遍历(DFS)按照实现方法可以分为:递归遍历实现.非递归遍历实现.Morris遍历实 ...
- c语言中fact函数怎么调用,C语言程序题: 1、编写一个求n!的函数fact(n),要求fact函数分别用递归和非递归两种方法实现...
点击查看C语言程序题: 1.编写一个求n!的函数fact(n),要求fact函数分别用递归和非递归两种方法实现具体信息 答:int fac(int n) //非递归{int f=1; for(;n;) ...
- 二叉树的几种递归和非递归式遍历:
二叉树的几种递归和非递归式遍历: 1 #include <fstream> 2 #include <iostream> 3 4 using namespace std; 5 6 ...
最新文章
- 疯狂java讲义之流程控制与数组
- C#中Console.ReadKey()与ConsoleKey的一些用法
- JS 原型对象(prototype)
- React Native工程修改Android包名
- Sinclair 的ZX Spectrum 年逾三十
- k8s删除deployment_VPGAME k8s迁移实践(5) Deployment 与 Service 配置
- “System.InvalidOperationException”类型的未经处理的异常在 ESRI.ArcGIS.AxControls.dll 中发生...
- mybatis的javaType和ofType
- MySQL开发医药管理系统_医药管理系统struts+hibernat+mySql,内含需求分析,详细设计文档...
- LinUX接收蓝牙音频,Win10 v2004已重新支持蓝牙A2DP音频串流接收功能
- 企业微信公众号怎么运营管理?
- linux服务器什么意思,linux中的“/”和“./”是什么意思
- Java - LinkedHashMap(有序 map)获取第一个元素和最后一个元素
- 我们为什么要结婚?(
- 计算机科学导论第三版——第一章课后习题(贝赫鲁兹·佛罗赞BehrouzForouzan)(渐水问个人答案笔记csdn)
- 数据结构实验课:实验五、二叉树操作及应用
- 什么是 SSH 以及常见 ssh 用法
- 【分隔结构】动宾分离
- Java 贪吃蛇游戏引言
- 第一次看母亲细嚼慢咽地吃饭,欣慰还是心酸?
热门文章
- 安装Ubuntu 12.04
- 杭电2073无限的路.水题
- PHP window2003服务和2008服务器上传个别文件访问报错
- 3d激光雷达开发(旋转和位移)
- 随想录(vc仿真下的嵌入式开发)
- jsp调用java的数据库连接,初学jsp,javabean连接数据库调用总是报错,疯了,求大神解决方案...
- kis显示用户登录服务器失败,金蝶KIS专业版提示用户KISAdmin登陆失败。原因:未与信任SQL Server连接相关联...
- socket.io php 聊天室,WebSocket学习(一)——基于socket.io实现简单多人聊天室
- java 简单阻塞队列,制作一个简单的任务队列(使用阻塞队列)
- mybatis select 返回值long null_Mybatis框架(二)