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个节点,非递归算法的更多相关文章

  1. 求二叉树中第K层结点的个数

    一,问题描述 构建一棵二叉树(不一定是二叉查找树),求出该二叉树中第K层中的结点个数(根结点为第0层) 二,二叉树的构建 定义一个BinaryTree类来表示二叉树,二叉树BinaryTree 又是由 ...

  2. 六:二叉树中第k层节点个数与二叉树叶子节点个数

    二叉树中第k层节点个数 递归解法: (1)假设二叉树为空或者k<1返回0 (2)假设二叉树不为空而且k==1.返回1 (3)假设二叉树不为空且k>1,返回左子树中k-1层的节点个数与右子树 ...

  3. 二叉树节点个数,叶子个数,第K层个数,最低公共节点

    1. 节点个数 function getNodeNum(root){ if(root == null){ return 0; } //+1为root的计数 return getNodeNum(root ...

  4. Java实现二叉树的前序、中序、后序、层序遍历(非递归方法)

      在上一篇博客中,实现了Java中二叉树的四种遍历方式的递归实现,接下来,在此实现Java中非递归实现二叉树的前序.中序.后序.层序遍历,在非递归实现中,借助了栈来帮助实现遍历.前序和中序比较类似, ...

  5. 求二叉树第K层的节点个数+求二叉树叶子节点的个数

    size_t _FindLeafSize(Node* root)     //求二叉树叶子节点的个数    {        //static size_t count = 0;        if ...

  6. 剑指offer:按之字形打印二叉树(栈|双向队列+中序遍历)

    1. 题目描述 /** 请实现一个函数按照之字形打印二叉树, 即第一行按照从左到右的顺序打印, 第二层按照从右至左的顺序打印, 第三行按照从左到右的顺序打印, 其他行以此类推. */ 2. 双向队列 ...

  7. 剑指offer60:把二叉树打印成多行。上到下按层打印二叉树。

    1 题目描述 从上到下按层打印二叉树,同一层结点从左至右输出.每一层输出一行. 2 思路和方法 vector变量存储每一层的元素vector<vector<int> > ans ...

  8. 二叉树(8)----第一个二叉树K层节点和二进制部分K叶节点层,递归和非递归

    1.二进制定义 typedef struct BTreeNodeElement_t_ { void *data; } BTreeNodeElement_t; typedef struct BTreeN ...

  9. 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 ...

随机推荐

  1. jdk的split 有多坑

    先看段 代码: String str = "4117|519951|长信利泰灵活配置混合型证券投资基金|长信利泰|3|3||||156|0||||||||||||||||||||{\&quo ...

  2. Hibernate + Oracle 创建自增序列ID

    1.创建自增序列 2.对ID创建触发器 3.Userinfo.hbm.xml使得<generator class="increment"> 序列: MAXVALUE I ...

  3. Nginx开启跨域访问

    CORS on Nginx The following Nginx configuration enables CORS, with support for preflight requests. # ...

  4. bash 中的变量可以这么用

    举个例子: t.sh ====================== #!/bin/bash ./a.sh ./b.sh ======================= a.sh =========== ...

  5. zoj 1375||poj 1230(贪心)

    Pass-Muraille Time Limit: 2 Seconds      Memory Limit: 65536 KB In modern day magic shows, passing t ...

  6. 【POJ】1089Intervals

    Intervals Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 8276   Accepted: 3270 Descrip ...

  7. [UOJ217]奇怪的线段树

    如果一个节点是$0$但它子树内有$1$那么无解,否则我们只需把那些是$1$但子树内没有其他$1$的节点(这些区间是被定位的区间)都访问一遍即可 根据ZKW线段树定位区间的过程,可以发现一段(从左到右) ...

  8. 【二分答案+智障的字符串hash】BZOJ2946-[Poi2000]公共串(Ranklist倒一达成!!!!!)【含hash知识点】

    [题目大意] 给出几个由小写字母构成的单词,求它们最长的公共子串的长度. [字符串hash的小笔记] hash[i]=(hash[i-1]*p+idx(s[i]))%mod,idx为映射值,一般a.. ...

  9. nginx 域名跳转 Nginx跳转自动到带www域名规则配置、nginx多域名向主域名跳转

    nginx 域名跳转 Nginx跳转自动到www域名规则配置,如果设置使 mgcrazy.com域名在用户访问的时候自动跳转到 www.mgcrazy.com呢?在网上找了好多资料都没有一个完整能解决 ...

  10. HDU 4632 Palindrome subsequence (2013多校4 1001 DP)

    Palindrome subsequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65535 K (Java/ ...