1. 程式人生 > >層次遍歷具有一般意義的演算法思路

層次遍歷具有一般意義的演算法思路

最近寫了幾道層序遍歷的題,發現大概思想都是一樣,內容源於課本,又高於課本

(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;
  }
  
}