加了队列
根节点入对,一个元素出队,出队元素的左,右节点入队(先左后右)
最基本的三层嵌套
-树或图不空{建立辅助元素,初始化-辅助元素不空时{-visit{添加辅助元素}}}
void level (BTNode *bt)
{
if (bt != NULL)
{
int front, rear;/*辅助队列的建立*/
BTNode *que[maxSize] ;
front = rear = 0;
BTNode *p;
rear = (rear + 1)%maxSize;
que[rear] = bt;/*入队*/
while (front != rear)
{
front = (front + 1)%maxSize;
p = que[front] ;
Visit(p) ;
if(p->lChild != NULL){rear = (rear + 1)%maxSize;que[rear] = p->1Child;}
if(p->rChild != NULL){rear = (rear + 1)%maxSize;que [rear] = p->rChild;}
}
}
)
void level (TNode *t,TNode tree[])
{
if (bt != NULL)
{
int front, rear;/*辅助队列的建立*/
BTNode *que[maxSize] ;
front = rear = 0;
TNode *p;
rear = (rear + 1)%maxSize;
que[rear] = t;/*入队*/
while (front != rear)
{
front = (front + 1)%maxSize;
p = que[front] ; Visit(p) ;
Branch* q=p->first;
//if(p->lChild != NULL){rear = (rear + 1)%maxSize;que[rear] = p->1Child;}
while(q!=NULL){rear=(rear+1)%maxsize;que[rear]=&tree[q->Cidx];q=q->next}
}
}
图的层序遍历的实现
多了visit数组和与之相关的操作。初始全零,每次访问置为1.
void level (G *G,int v)(BTNode *bt)
{
int front, rear;/*辅助队列的建立*/
BTNode *que[maxSize] ;
front = rear = 0;
Visit(v);visit[v]=1;
ArcNode *p;
rear = (rear + 1)%maxSize;
que[rear] = v;/*入队*/
while (front != rear)
{
front = (front + 1)%maxSize;
p = que[front] ;
Visit(p) ;
if(p->lChild != NULL){rear = (rear + 1)%maxSize;que[rear] = p->1Child;}
if(p->rChild != NULL){rear = (rear + 1)%maxSize;que [rear] = p->rChild;}
}
)
void level (BTNode *bt)
{
if (bt != NULL)
{
int front, rear;/*辅助队列的建立*/
BTNode *que[maxSize] ;
front = rear = 0;
BTNode *p;
rear = (rear + 1)%maxSize;
que[rear] = bt;/*入队*/
while (front != rear)
{
front = (front + 1)%maxSize;
p = que[front] ;
Visit(p) ;
if(p->lChild != NULL){rear = (rear + 1)%maxSize;que[rear] = p->1Child;}
if(p->rChild != NULL){rear = (rear + 1)%maxSize;que [rear] = p->rChild;}
}
}
)
二叉树的先序遍历的非递归实现
先序遍历的非递归实现:
栈(后进先出)
顺序颠倒:因为输出顺序是根左右,就是要求左孩子比右孩子先访问,所以,左孩子后入
void preorderNocur(*BTnode b)
{
if(b!=NULL)/*如果为空什么都不做*/
{
BTnode *stack[maxsize];/*辅助栈的建立*/
int top=-1;
stack[++top]=b;
while(top!=-1)//栈非空
{
出站访问
p=stack[top--];/*出栈*/visite(p);/*访问*/
if(p->RChild !=NULL){stack[++top]=p->RChild;}
if(p->LChild !=NULL){stack[++top]=p->LChild;}
}
}
}