二叉树(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;
}
时间: 2024-10-07 05:06:08

二叉树(9)----打印二叉树中第K层的第M个节点,非递归算法的相关文章

二叉树的前序、中序、后序遍历的递归和非递归算法实现

1 /** 2 * 二叉树的前序.中序.后序遍历的递归和非递归算法实现 3 **/ 4 5 //二叉链表存储 6 struct BTNode 7 { 8 struct BTNode *LChild; // 指向左孩子指针 9 ELEMENTTYPE data; // 结点数据 10 struct BTNode *RChild; // 指向右孩子指针 11 }; 12 13 /** 14 * 前序遍历 15 **/ 16 // 递归实现 17 void PreorderTraversal(BTNo

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

二叉树中第k层节点个数 递归解法: (1)如果二叉树为空或者k<1返回0 (2)如果二叉树不为空并且k==1,返回1 (3)如果二叉树不为空且k>1,返回左子树中k-1层的节点个数与右子树k-1层节点个数之和 代码如下: int GetNodeNumKthLevel(BinaryTreeNode *pRoot, int k) { if(pRoot == NULL || k < 1) return 0; if(k == 1) return 1; int numLeft = GetNodeN

二叉树的前序、中序、后序遍历(递归、非递归)实现

本文部分来源于CSDN兰亭风雨大牛的原创.链接为http://blog.csdn.net/ns_code/article/details/12977901 二叉树是一种非常重要的数据结构,很多其他数据机构都是基于二叉树的基础演变过来的.二叉树有前.中.后三种遍历方式,因为树的本身就是用递归定义的,因此采用递归的方法实现三种遍历,不仅代码简洁且容易理解,但其开销也比较大,而若采用非递归方法实现三种遍历,则要用栈来模拟实现(递归也是用栈实现的).下面先简要介绍三种遍历方式的递归实现,再详细介绍三种遍

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

1. 节点个数 function getNodeNum(root){ if(root == null){ return 0; } //+1为root的计数 return getNodeNum(root.left) + getNodeNum(root.right) + 1; } 2. 叶子个数 function getLeafNum(root){ if(root == null){ return 0; } if(root.left == null && root.right == null)

二叉树详解及二叉树的前序、中序、后序遍历(递归和非递归)

介绍二叉树之前先介绍一下树相关的概念. 树的定义:树是n(n>=0)个有限个数据的元素集合,形状像一颗倒过来的树. 树的概念: 节点:结点包含数据和指向其它节点的指针. 根节点:树第一个结点称为根节点. 结点的度:结点拥有的子节点个数. 叶节点:没有子节点的节点(度为0). 父子节点:一个节点father指向另一个节点child,则child为孩子节点,father为父亲节点 兄弟节点:具有相同父节点的节点互为兄弟节点. 节点的祖先:从根节点开始到该节点所经的所有节点都可以称为该节点的祖先. 子

【数据结构】二叉树(前、中、后)序遍历的递归与非递归算法

对于二叉树,有前序.中序以及后序三种遍历方法.因为树的定义本身就是递归定义,因此采用递归的方法去实现树的三种遍历不仅容易理解而且代码很简洁.而对 于树的遍历若采用非递归的方法,就要采用栈去模拟实现.在三种遍历中,前序和中序遍历的非递归算法都很容易实现,非递归后序遍历实现起来相对来说要难一 点. 二叉树前序:访问根节点->左子树->右子树 (1)递归写法: 依次访问根节点.左子树.右子树,注意递归出口的结束. void _PrevOrder(Node* root)     {         i

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

size_t _FindLeafSize(Node* root)     //求二叉树叶子节点的个数    {        //static size_t count = 0;        if (root == NULL)            return 0; if (root->_left == NULL&&root->_right == NULL);        return 1; return _FindLeafSize(root->_right) +

按层换行打印二叉树

题目描述:  二叉树,按层打印,并且每层换行 分析:  我们知道,二叉树的层序遍历需要借助队列来实现,每取出一个节点打印,并将该节点的左右孩子放入队列中,依此反复,直到队列为空时,也就完成了二叉树的按层打印. 基本过程如图所示: 但是,关键是怎么换行? 分析:要换行则需要知道什么时候换行,由二叉树我们可以分析,我们需要知道每一层最右边的节点,每次打印完这个节点的值后,再打印一个换行即可.于是我们这样做: 定义两个变量,last 和 nlast last : 表示正在打印的当前行的最右节点 nla

【36】按层打印二叉树

算法题目大都比较抽象,可以通过举例子来搞清楚具体的逻辑. 题目: 从上到下,按照从左往右打印二叉树每一层的结点. 二叉树的结点: class BinaryTreeNode{ int mValue; BinaryTreeNode mLeft;; BinaryTreeNode mRight; } 思路: 我们发现规律:先遍历的结点,它的子节点也会先被遍历到,是一个先进先出的模型,考虑用队列来实现. 没遍历一个结点时候,就把它的孩子结点取出来,放到队列的尾部,然后重复这个过程,直到队列为空. 代码: