二叉树(9)----打印二叉树中第K层的第M个节点,非递归算法
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 <BTreeNode_t *> 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;
}
二叉树(9)----打印二叉树中第K层的第M个节点,非递归算法的更多相关文章
- 求二叉树中第K层结点的个数
一,问题描述 构建一棵二叉树(不一定是二叉查找树),求出该二叉树中第K层中的结点个数(根结点为第0层) 二,二叉树的构建 定义一个BinaryTree类来表示二叉树,二叉树BinaryTree 又是由 ...
- 六:二叉树中第k层节点个数与二叉树叶子节点个数
二叉树中第k层节点个数 递归解法: (1)假设二叉树为空或者k<1返回0 (2)假设二叉树不为空而且k==1.返回1 (3)假设二叉树不为空且k>1,返回左子树中k-1层的节点个数与右子树 ...
- 二叉树节点个数,叶子个数,第K层个数,最低公共节点
1. 节点个数 function getNodeNum(root){ if(root == null){ return 0; } //+1为root的计数 return getNodeNum(root ...
- Java实现二叉树的前序、中序、后序、层序遍历(非递归方法)
在上一篇博客中,实现了Java中二叉树的四种遍历方式的递归实现,接下来,在此实现Java中非递归实现二叉树的前序.中序.后序.层序遍历,在非递归实现中,借助了栈来帮助实现遍历.前序和中序比较类似, ...
- 求二叉树第K层的节点个数+求二叉树叶子节点的个数
size_t _FindLeafSize(Node* root) //求二叉树叶子节点的个数 { //static size_t count = 0; if ...
- 剑指offer:按之字形打印二叉树(栈|双向队列+中序遍历)
1. 题目描述 /** 请实现一个函数按照之字形打印二叉树, 即第一行按照从左到右的顺序打印, 第二层按照从右至左的顺序打印, 第三行按照从左到右的顺序打印, 其他行以此类推. */ 2. 双向队列 ...
- 剑指offer60:把二叉树打印成多行。上到下按层打印二叉树。
1 题目描述 从上到下按层打印二叉树,同一层结点从左至右输出.每一层输出一行. 2 思路和方法 vector变量存储每一层的元素vector<vector<int> > ans ...
- 二叉树(8)----第一个二叉树K层节点和二进制部分K叶节点层,递归和非递归
1.二进制定义 typedef struct BTreeNodeElement_t_ { void *data; } BTreeNodeElement_t; typedef struct BTreeN ...
- LeetCode OJ:Kth Smallest Element in a BST(二叉树中第k个最小的元素)
Given a binary search tree, write a function kthSmallest to find the kth smallest element in it. Not ...
随机推荐
- shell日志重定向到null
用输出重定向符号> 即可,格式如下:shell命令 >/dev/null 若要将标准错误输出也一并重定向,如下:shell命令 >/dev/null 2>&1这样就不管 ...
- POJ 2318 TOYS(点与直线的关系 叉积&&二分)
题目链接 题意: 给定一个矩形,n个线段将矩形分成n+1个区间,m个点,问这些点的分布. 题解: 思路就是叉积加二分,利用叉积判断点与直线的距离,二分搜索区间. 代码: 最近整理了STL的一些模板,发 ...
- 有一种感动叫ACM(WJMZBMR在成都赛区开幕式上的讲话)
各位选手,各位教练,大家好,我是来自清华大学交叉信息学院的陈立杰,今天很荣幸站在这里代表全体参赛选手发言.对于我来说,这是我第一次正式参加ACM的比赛.不过我跟ACM之间的缘分,大概在很早的时候就已经 ...
- Linux前后台进程切换
(1).Linux前台进程与后台进程的区别 前台进程:是在终端中运行的命令,那么该终端就为进程的控制终端,一旦这个终端关闭,这个进程也随之消失. 后台进程:也叫守护进程(Daemon),是运行在后台的 ...
- ElasticSearch Mapping中的字段类型
1)string: 默认会被分词 2)数字类型主要如下几种: long:64位存储 integer:32位存储 short:16位存储 byte:8位存储 double:64位双精度存储 f ...
- 【贪心】POJ1328-Radar Installation
[思路] 以每一座岛屿为圆心,雷达范围为半径作圆,记录下与x轴的左右交点.如果与x轴没交点,则直接退出输出“-1”.以左交点为关键字进行排序,从左到右进行贪心.容易知道,离每一个雷达最远的那一座岛与雷 ...
- 邮件发送javamail
写在前面: 最近要将dms系统原始发邮件的功能(调用的webservice)改变成使用smtp服务来发送邮件(使用javamail来发送),这里简单记录下,方便日后有用到,直接拿来用即可. 首先导入需 ...
- Problem H: 零起点学算法109——单数变复数
#include <stdio.h> #include<string.h> int main(void) { int n; ]; scanf("%d",&a ...
- js 根据开始日期和结束日期显示倒计时
<html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Con ...
- 简单理解SNAT回流中的概念:路由器怎么知道外网返回的数据是局域网中哪台主机的
内网到外网用的是NAT技术(地址封装)外网到内网用的是端口映射(PNAT)计算机的端口又65535(0-65534),你说的那些有名气的端口大多都是0-1023之间的你说的这个问题很简单,但首先你要懂 ...