思想:採用基于层序遍历的方法。

用level扫描各层节点,若某一层的节点出队后。rear指向该层中最右节点。则将rear赋值给last(对于第一层。last=1).在出队时,若front=last,表示这一层处理完成,让层号level增1,并置last为下一层最右节点。那么怎样求一层的最右节点呢?这是由于第一层仅仅有一个节点,它就是最右节点。对于其它层。上一层最右节点最后进队的孩子一定是该层的最右节点。

比如,对于如图所看到的的二叉树。求k=3的叶子节点个数的步骤例如以下:level=1;A进队时rear=1,last=rear=1,出队front=1,再将B和C进队,此时rear=3,因为last=front成立,表示处理下一层。让last=rear=3,level=level+1=2;
出队front=2即B节点。将D和E进队,出队front=3即C节点。将F进队,此时rear=6,因为front=rear成立,表示处理下一层。让last=rear=6,level=level+1=3;出队D(front=4),level=k且D为叶子节点,则leaf=leaf+1=1,出队E(front=5),level=k且E为叶子节点。则leaf=leaf+1=2,出队F(front=6),level=k且F为叶子节点,则leaf=leaf+1=3,因为front=last成立。表示处理下一层,让last=rear=6(没有新节点进队),level=level+1=4;level>k,返回leaf=3.

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" align="left" alt="">























相应的算法例如以下:

int LeafKLevel(BTNode *b,int k)

{

BTNode *Qu[MaxSize];//定义循环队列

int front, rear;//定义队首、队尾指针

int leaf=0;//leaf累计叶子节点个数

int last;//定义当前层中最右节点在队列中的位置

int level;//定义当前节点的层号

front=rear=0;//置队列为空队列

if(b==NULL||k<=1)

return 0;

rear=(rear+1)%MaxSize;//节点指针进队

Qu[rear]=b;

last=rear;level=1;//第一层的最右节点在队列中的位置为1

while(front!=rear)//队列不为空时循环

{

front=(front+1)%MaxSize;

b=Qu[front];//队头出队

if(level==k&&b->lchild==NULL&&b->rchild==NULL)

leaf++;//若*b为level层叶子节点。则递增1

if(b->lchild!=NULL)//左孩子进队

{

rear=(rear+1)%MaxSize;

Qu[rear]=b->lchild;

}

if(b->rchild!=NULL)//右孩子进队

{

rear=(rear+1)%MaxSize;

Qu[rear]=b->rchild;

}

if(front==last)//同层最右节点处理完成,层数增1

{

level++;

last=rear;//让last指向下一层的最右节点在队列中的位置

}

  if(level>k)//当层号大于k时返回leaf,不再继续

return leaf;

}

}

对于如图所看到的的二叉树,求各层叶子节点个数结果如图所看到的:

二叉树:A(B(D(,G)),C(E,F))

第1层叶子节点的个数=0

第2层叶子节点的个数=0

第3层叶子节点的个数=3

设计一个算法,求非空二叉树中指定的第k层(k&gt;1)的叶子节点的个数的更多相关文章

  1. 有一个线性表,采用带头结点的单链表L来存储,设计一个算法将其逆置,且不能建立新节点,只能通过表中已有的节点的重新组合来完成。

    有一个线性表,采用带头结点的单链表L来存储,设计一个算法将其逆置,且不能建立新节点,只能通过表中已有的节点的重新组合来完成. 分析:线性表中关于逆序的问题,就是用建立链表的头插法.而本题要求不能建立新 ...

  2. 非空二叉树的一个有趣的性质:n0 = n2 + 1

    对任何非空二叉树T,若n0 表示叶结点的个数.n2 表示度为2 的非叶结点的个数,那么两者满足关系n0 = n2 + 1. 这个性质很有意思,下面我们来证明它. 证明:首先,假设该二叉树有N 个节点, ...

  3. 设单链表中存放n个字符,试设计一个算法,使用栈推断该字符串是否中心对称

    转载请注明出处:http://blog.csdn.net/u012860063 问题:设单链表中存放n个字符.试设计一个算法,使用栈推断该字符串是否中心对称,如xyzzyx即为中心对称字符串. 代码例 ...

  4. python学习:设计一个算法将缺失的数字找出来。

    算法题   已知整型数值 a[99], 包含的所有99个元素都是从1-100中随机取值,并且这99个数两两互不相等,也就是说从1到100这100个数字有99个在数值内,有一个缺失.请设计一个算法将缺失 ...

  5. 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。 如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润。

    给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润. 注意你不能在买入股票前卖出股票. 示例 ...

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

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

  7. 一个解决在非UI线程中访问UI 异常的小方法

    写 WPF 的童鞋可能都会碰到 在非UI线程中访问 UI 异常的问题.这是为了防止数据不一致做的安全限制. 子线程中更新UI还要交给主线程更新,引用满天飞,实在是麻烦. 接下来,我们推出一个可以称之为 ...

  8. 设计一个算法,採用BFS方式输出图G中从顶点u到v的最短路径(不带权的无向连通图G採用邻接表存储)

    思想:图G是不带权的无向连通图.一条边的长度计为1,因此,求带顶点u和顶点v的最短的路径即求顶点u和顶点v的边数最少的顶点序列.利用广度优先遍历算法,从u出发进行广度遍历,类似于从顶点u出发一层一层地 ...

  9. 数据结构作业——P53算法设计题(6):设计一个算法,通过一趟遍历确定长度为n的单链表中值最大的结点

    思路: 设单链表首个元素为最大值max 通过遍历元素,与最大值max作比较,将较大值附给max 输出最大值max 算法: /* *title:P53页程序设计第6题 *writer:weiyuexin ...

随机推荐

  1. BUG出现的地方真的令我这个测试新人想象不到

    今天上班,仍然在等待下一阶段项目的研发完成. 没有正式测试任务的我,作为新手肯定要趁着这个时间好好学习了,偶尔再拿出公司已经上线发布的APP来到处看看. 就在这偶尔的情况下让我发现了一个在正式测试时根 ...

  2. WinForm窗体设置

    属性: 软件启动后在屏幕中间 StartPosition = CenterScreen取消放大按钮 MaximizeBox = false不能拖动边框 FormBorderStyle = FixedD ...

  3. spark-shell启动集群

    使用spark-shell  启动spark集群时的流程简析: spark-shell->spark-submit->spark-class 在sprk-class中根据条件会从不同的入口 ...

  4. SQL中常用的时间格式

    一些常用的时间格式 先讲一下一些基本的格式模式 格式模式      说明 d                   月中的某一天.一位数的日期没有前导零. dd                 月中的某 ...

  5. C#数组的指定位置复制函数

    1. // 源数组 - 起始位置 -目的数组 - 起始位置 - 长度 System.Array.Copy(mcu_data, 2, read_mcu_data_whole, 0, mcu_data.L ...

  6. C#中KeyDown和KeyPress区别

    1.比如说TexBox 输入'a' 按下->触发KeyDown事件,然后去处理 ->将a显示输入到文本框后 ->触发KeyPress事件

  7. 最小日志量的insert操作

    --1.实验环境 SQL> conn scott/tiger Connected to Oracle Database 11g Enterprise Edition Release 11.2.0 ...

  8. Symfony2 Doctrine从现有Database生成Entity(转载自http://blog.it985.com/6809.html)

    在我的以前一章Symfony之十分钟入门说了怎样生成数据库,然后设计实体Entity,再同步数据库的表结构,一般我们的顺序都是这样:生成数据库->设计实体Entity->同步数据库表结构. ...

  9. Django 403错误:CSRF verification failed. Request aborted

    网上有解决办法,我自己的组合是: 一,FORM加标识 <form action="" method="post"> {% csrf_token %} ...

  10. 商派shopex

    http://www.shopex.cn/48release/shopexsingle_exper.php 在线体验 前台体验:http://demo.shopex.com.cn/485 后台体验:h ...