您的位置:首页 > 其它

二叉树的层次遍历 队列

2012-11-17 19:14 399 查看
二叉树的层次遍历,是指从二叉树的第一层(根结点)开始,从上至下逐层遍历。在同一层中,则按从左到右的顺序对结点逐个访问。在进行层次遍历时,当前层结点访问完后,再按照它们的访问次序对各个结点的左孩子和右孩子顺序访问,这样一层一层进行,先遇到的结点先访问,这与队列的操作原则比较吻合。因此,在进行层次遍历时,可设置一个队列结构,遍历从二叉树的根结点开始,首先将根结点指针入队列,然后从对列头取出一个元素,每取一个元素,同时执行下面两个操作:

  (1)访问该元素所指结点,也就是打印出来;

DeQueue(Q,x);  //先弹出压入队列的节点
printf("%c",(*x)->data);


  (2)若该元素所指结点的左、右孩子结点非空,则将该元素所指结点的左孩子指针和右孩子指针顺序入队。

if((*x)->lchild)  //同时判断有无左孩子节点,如果存在压入队列
EnQueue(Q,(*x)->lchild);
if((*x)->rchild)  //再判断有无右孩子节点,如果存在压入队列
EnQueue(Q,(*x)->rchild);


  此过程不断进行,当队列为空时,二叉树的层次遍历结束。

while(!QueueIsEmpty(Q)) //非空,一直到全部弹出为止


关键就是一个出队,一个入队操作。总代码如下:

void LayerOrder(BiTree T)
{
BiTree *x;
x = (BiTree*)malloc(sizeof(BiTree));
if(NULL == x)
printf("内存分配失败!\n");

LinkQueue *Q;
Q = (LinkQueue*)malloc(sizeof(LinkQueue));
InitQueue(Q);           //对列初始化
EnQueue(Q,T);           //根节点T入栈,先压入根节点
while(!QueueIsEmpty(Q)) //非空,一直到全部弹出为止
{
DeQueue(Q,x);       //弹出压入的节点
printf("%c",(*x)->data);
if((*x)->lchild)   //同时判断有无左孩子节点,如果存在压入队列
EnQueue(Q,(*x)->lchild);
if((*x)->rchild)   //再判断有无右孩子节点,如果存在压入队列
EnQueue(Q,(*x)->rchild);
}
}

转自:/article/5839778.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: