二叉树层序遍历即从上往下、自左而右地访问每个节点,但按这样的顺序的话,相邻访问的两个节点间大多没有直接联系,不易访问,所以会显得比较麻烦,不过我们有队列这个好东西,建一个顺序表队列,里面按顺序存入每个节点的地址,之后在队列中按顺序访问就行了。关键是用队列到底能不能恰好地把每一个节点按从上往下、自左而右的顺序存储起来呢?请看如下分析。
local表示当前访问的节点在队列中的位置,length表示队列的长度。local=0时在访问A,此时可把B、C加入队列,length=3;当local=1访问B时,恰好能把D、E依次放在队尾,且队列中的元素顺序符合“层序”,依次类推。显然length最大值会是二叉树元素总数,当最终扫描到最后一个元素时local=length,此时结束循环。实现代码如下:
1 #define SIZE_OF_QUEUE 256 2 //lchild指向左子树 3 //rchild指向右子树 4 typedef struct BTree{ 5 int data; 6 struct BTree *lchild; 7 struct BTree *rchild; 8 }BT; 9 10 void displayByLevel(BT root){ 11 BT queue[SIZE_OF_QUEUE]; 12 int local; 13 int length; 14 queue[0] = root; 15 local = 0; 16 length = 1; 17 while(local < length){ 18 printf("%d\n", queue[local]->data); 19 if(queue[local]->lchild != NULL) 20 queue[length++] = queue[local]->lchild; 21 if(queue[local]->rchild != NULL) 22 queue[length++] = queue[local]->rchild; 23 local++; 24 } 25 }
时间: 2024-12-14 10:04:58