typedef struct node
{
ElemType data;
struct node *lchild;
struct node *rchild;
}BTNode;
void LevelOrder(BTNode *b)
{
BTNode *p;
BTNode qu[MaxSize];
int front,rear;
front=rear=0;
rear++;
qu[rear]=b;
while(front != rear)
{
front = (front+1)%MaxSize;
p = qu[front];
printf("%c ",p->data);
if(p->lchild != NULL)
{
rear = (rear+1)%MaxSize;
qu[rear] = p->lchild;
}
if(p->rchild != NULL)
{
rear = (rear+1) % MaxSize;
qu[rear] = p->rchild;
}
}
}
求非空二叉树的最大宽度
int BTWidth(BSTNode *b)
{
struct
{
BTNode *data[MaxSize];
int level[MaxSize];
int front,rear;
}Qu;
BTNode *p;
int k,max,i,n;
Qu.front = Qu.rear = -1;
Qu.rear++;
Qu.data[Qu.rear] = b;
Qu.level[Qu.rear] = 1;
while(Qu.front < Qu.rear)
{
Qu.front++;
p = Qu.data[Qu.front];
k = Qu.level[Qu.front];
if(p->lchild != NULL)
{
Qu.rear++;
Qu.data[Qu.rear] = p->lchild;
Qu.level[Qu.rear] = k +1;
}
if(p->rchild != NULL)
{
Qu.rear++;
Qu.data[Qu.rear] = p->rchild;
Qu.level[Qu.rear] = k +1;
}
}
for(i=0;i<Qu.rear;i++)
printf("%c,%d\n",Qu.data[i]->data,Qu.level[i]);
max = 0 ,i =0;
k=1;
while(i<=Qu.rear)
{
n=0;
while(i<=Qu.rear && Qu.level[i] == k)
{
n++;
i++;
}
k = Qu.level[i];
if(n > max )
max = n;
}
return max;
}
输出每个叶子节点到根节点的逆路径
void AllPath(BTNode *b)
{
struct snode
{
BTNode *node;
int parent;
}Qu[MaxSize];
int front,rear,p;
front=rear=-1;
rear++;
Qu[rear].node = b;
Qu[rear].parent = -1;
while(front < rear)
{
front++;
b = Qu[front].node;
if(b->lchild == NULL && b->rchild == NULL)
{
printf(" %c 到根节点逆路径:",b->data);
p=front;
while(Qu[p].parent != -1)
{
pritnf("%c->",Qu[p].node->data);
p = Qu[p].parent;
}
printf("%c\n",Qu[p].node->data);
}
if(b->lchild != NULL)
{
rear++;
Qu[rear].node = b->lchild;
Qu[rear].parent = front;
}
if(b->rchild != NULL)
{
rear++;
Qu[rear].node = b->rchild;
Qu[rear].parent = front;
}
}
}