数据结构---层次遍历

来源:互联网 发布:怎么设置淘宝客服分流 编辑:程序博客网 时间:2024/06/06 16:25


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;
}
}

}