最近写了几道层序遍历的题,发现大概思想都是一样,内容源于课本,又高于课本
(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;
}
}