[算法]利用队列来求出二叉树的宽度

 

 

我的想法是利用循环队列来存储每一层的结点,但是我存完每一层之后都加1个flag标记这一层完了,出队时就可以统计下一层的结点数,利用maxLevel存放当前层以上(包括当前层)的宽度,currentLevel存放下层的结点数,当这一层出完之后,比较maxLevel,currentLevel,maxLevel=max(maxLevel,currentLevel).currentLevel复位为0,继续对下一层出队.
最后返回maxLevel
代码如下

 1 void enQueue(BTNode* qu[],BTNode* p,int &rear)
 2 {
 3     rear = (rear+1)%maxSize ;
 4         qu[rear] = p;
 5 }
 6 int width(BTNode* p)
 7 {
 8     if(p==NULL) return 0;
 9     BTNode* qu[maxSize];
10     int front = rear = 0;
11     BTNode* flag = new BTNode;   //等同BTNode* flag = (BTNode*)malloc(sizeof(BTNode));
12     enQueue(qu,p,rear);
13     enQueue(qu,flag,rear);
14     int maxLevel = 1, currentLevel = 0;//第一层宽度为1,下一层赋值为0,待统计
15     while(front!=rear)
16     {
17         while(qu[(front+1)%maxSize]!=flag)
18         {
19             front = (front+1)%maxSize;
20             if(qu[front]->lchild!=NULL)
21             {
22                 enQueue(qu,qu[front]->lchild,rear);
23             }
24             if(qu[front]->rchild!=NULL)
25             {
26                 enQueue(qu,qu[front]->rchild,rear);
27             }
28         }
29         front = (front+1)%maxSize;//当前层的flag出队
30         if(currentLevel != 0)//下一层有结点才加flag
31         {
32             enQueue(qu,flag,rear);
33         }
34         if(maxLevel < currentLevel)
35         {
36             maxLevel = currentLevel;
37         }
38         currentLevel = 0;
39     }
40     delete flag;//相当于free(flag);
41     return maxLevel;
42 }      

你可能感兴趣的:(二叉树)