层次遍历具有一般意义的算法思路

最近写了几道层序遍历的题,发现大概思想都是一样,内容源于课本,又高于课本

(1)层序遍历是用队列实现的,故一整套流程是一定要顺下来:首先定义一个循环队列,定义队首指针front,定义队尾指针rear。

   均初始化为0.表示队列为空。

将根节点入队,此时队列非空。while(front!=rear)

在循环体内执行根节点出队列,若其左孩子非空,则左孩子进队,若右孩子非空,则右孩子进队。

(2)下面就是对于实现不同的操作在上述框架里添加的东西。

若要实现:统计某一层K中叶子结点的个数。(重要观点:要记录本层最后一个结点last,当front==last时,说明遍历到本层最后一个结点,此时的rear值也正好是下一层的最后一个结点,故将last=rear实现last的更新,同时level++ 此乃整个算法的灵魂)

typedef struct BTNode
{
  int data;
  struct BTNode *lchild, *rchild;
}BTNode,*root;

#define maxsize 100;
int levelorder(BTNode *root, int k)
{
  BTNode*  q[maxsize];    //定义队列
  int front,rear;         //定义队首,队尾指针
  int leaf=0;             //统计叶子结点个数,初值为0
  front=rear=0;
  int level=0;             //统计层数
  int last;               //用来指向本层最后一个结点

  if(root==NULL || k<=1) return 0;
  q[rear++]=root;    //根节点入队
  last=rear;          //初始化last
  level=1;            

  while(front!=rear)
  {
     BTNode *t=q[front++];
     if(level==k && t->lchild==NULL && t->rchild==NULL)
         leaf++;
     if(t->lchild!=NULL)
     {
         q[rear++]=t->lchild;
     }
     if(t->rchild!=NULL)
     {
          q[rear++]=t->rchild;
     }
     if(front==last)
     {
          level++;
           last=rear;
      }
     if(level>k)
       return leaf;
  }
  
}

猜你喜欢

转载自blog.csdn.net/weixin_42682806/article/details/84347489