zoukankan      html  css  js  c++  java
  • 设计一个算法,求非空二叉树中指定的第k层(k>1)的叶子节点的个数

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

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













    相应的算法例如以下:

    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

  • 相关阅读:
    一个C#读写Dxf的类库DXFLibrary
    我的敏捷之路
    C#+GDAL读写文件
    IIS并发连接数和数据库连接池
    .net网站iis应用池完美解决方案
    超时时间已到。超时时间已到,但是尚未从池中获取连接。出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小。
    C#代码连接Oracle数据库一段时间以后[connection lost contact]的问题
    C#程序以管理员权限运行
    C#流总结(文件流、内存流、网络流、BufferedStream、StreamReader/StreamWriter、TextReader/TextWriter)
    Redis连接的客户端(connected_clients)数过高或者不减的问题解决方案
  • 原文地址:https://www.cnblogs.com/blfshiye/p/5175735.html
Copyright © 2011-2022 走看看