算法思路
用队列存储左右子女的地址。当从队列中拿出一个节点时,将这个节点的左右子女的地址也放到队列中
代码
#include <stdio.h>
#include <stdlib.h>
//二叉树节点的结构
typedef struct node{
int data;//存储节点的值
struct node *left,*right;//指向二叉树的左右节点的指针
}BTNode;
//创建一颗二叉查找树(右子女比左子女大)
BTNode *CreateBTNode(int a[],int n)
{
BTNode *root,*pa,*c,*p;
//创建根节点
root = (BTNode *)malloc(sizeof(BTNode));
root->data=a[0];
root->right=root->left=NULL;
int i;
for(i=1;i<n;i++)
{
p=(BTNode *)malloc(sizeof(BTNode));
p->data=a[i];
p->right=p->left=NULL;
c=root;
while(c)
{
pa=c;
if(c->data > p->data)
{
c=c->left;
}else{
c=c->right;
}
}
if(pa->data > p->data)
{
pa->left=p;
}else{
pa->right=p;
}
}
return root;
}
//按层遍历
void Level_order(BTNode *root,int n){
BTNode **Q;//队列指针
BTNode *p;
int front,rear;//队首指针,队尾指针
front = rear =-1;
Q = (BTNode **)malloc((n+1)*sizeof(BTNode *));//申明队列空间
Q[++rear] = root;//根节点首先存储到队列
//当队列为空的时候,则遍历结束
while (front != rear){
p = Q[++front];
printf("%d\t",p->data);
//将左右子女的地址存入队列
if (p->left){
Q[++rear] = p->left;
}
if (p->right) {
Q[++rear] = p->right;
}
}
free(Q);
}
int main(void){
BTNode *root;
int data[10] = {3,2,5,8,4,7,6,9,0,1};
//创建二叉查找树
root = CreateBTNode(data,10);
//按层遍历
Level_order(root,10);
return 0;
}