博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
二叉树(9)----打印二叉树中第K层的第M个节点,非递归算法
阅读量:6271 次
发布时间:2019-06-22

本文共 1838 字,大约阅读时间需要 6 分钟。

1、二叉树定义:

typedef struct BTreeNodeElement_t_ {    void *data;} BTreeNodeElement_t;typedef struct BTreeNode_t_ {    BTreeNodeElement_t *m_pElemt;    struct BTreeNode_t_    *m_pLeft;    struct BTreeNode_t_    *m_pRight;} BTreeNode_t;

2、求二叉树中第K层的第M个节点

(1)非递归算法

借助队列实现

首先将给定根节点pRoot入队:

第一步:假设队列未空,获取当前队列的长度,即当前层的节点总数;

第二步:记录当前遍历的层数,推断是否超出指定层数,假设超出则退出;假设小于指定层数。则对当前层的全部左右节点入队操作;假设等于指定 层数,则进行第三步;

第三步:获取当前队列中节点总数。假设当前节点总数小于指定节点数,则退出;假设节点总数大于指定节点数,则进行第四步;

第四步:遍历当前层节点,假设节点数等于指定节点数。则放回此节点。

第三步:循环结束后,假设没有符合条件的节点就返回NULL。

BTreeNode_t   * GetKthLevelMthNode( BTreeNode_t *pRoot, int KthLevel, int MthNode){    if( pRoot == NULL || KthLevel <= 0 || MthNode <= 0 )        return NULL;    queue 
que; que.push( pRoot );//首先将根节点入队 int level = 0; //当前层计数器 int cntNode = 0; //当前层节点数计数器 int curLevelNodesTotal = 0;//当前层节点总数 while( !que.empty() ){ ++level; if( level > KthLevel)//假设层数已大于指定层数,则退出 break; cntNode = 0; //当前层节点数计数器归0 curLevelNodesTotal = que.size();//当前层的节点总数 while( cntNode < curLevelNodesTotal ){ ++cntNode;//记录当前层的节点数 pRoot = que.front(); que.pop(); if( level == KthLevel && cntNode == MthNode ){ //看当前节点的层数和在当前层中的节点次序是否符合要求 break; } //将当前层节点的左右结点均入队,即将下一层节点入队 if( pRoot->m_pLeft ) que.push( pRoot->m_pLeft); if( pRoot->m_pRight) que.push( pRoot->m_Right); } if( level == KthLevel && cntNode == MthNode ){ //看当前节点的层数和在当前层中的节点次序是否符合要求 break; } } while( !que.empty()){//清空栈 que.pop(); } if( level == KthLevel && cntNode == MthNode ){ //看当前节点的层数和在当前层中的节点次序是否符合要求 return pRoot; } return NULL;}

转载地址:http://qjlpa.baihongyu.com/

你可能感兴趣的文章
ASP.NET MVC:WebPageBase.cs
查看>>
Xen虚拟机的创建和启动
查看>>
Design Pattern: Factory Method 模式
查看>>
改善C#程序的建议7:正确停止线程
查看>>
数据库SQL优化大总结之 百万级数据库优化方案(转)
查看>>
瘦了!光荣!都是忙工作忙的!
查看>>
使用嵌入式关系型SQLite数据库存储数据
查看>>
初步学习pg_control文件之十五
查看>>
使用Notepad++开发C#,一个复杂点的csscript脚本
查看>>
jQuery的Internal DSL
查看>>
PL/pgSQL函数带output参数例子
查看>>
【spring set注入 注入集合】 使用set注入的方式注入List集合和Map集合/将一个bean注入另一个Bean...
查看>>
Nginx多站点设置及负载均衡
查看>>
Spring中bean注入前后的一些操作:
查看>>
如何让oracle DB、监听和oem开机启动(dbstart)
查看>>
HDU 2639 Bone Collector II(01背包变形【第K大最优解】)
查看>>
MailMail正式发布!注册码免费发放活动开启!(已结束~~不要再回复咧~)
查看>>
一个分层架构设计的例子(2)
查看>>
时态数据库的应用介绍(2)--时态数据库之TimeDB
查看>>
BZOJ 1207: [HNOI2004]打鼹鼠【妥妥的n^2爆搜,dp】
查看>>