層次遍歷具有一般意義的演算法思路
阿新 • • 發佈:2018-11-25
最近寫了幾道層序遍歷的題,發現大概思想都是一樣,內容源於課本,又高於課本
(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; } }