二叉树层次遍历队列实现
这念头学艺不精就要被人鄙视,自国外某知名软件公司面试完后,发现学过的全忘脑后了。对着面试官只能“说不知道”,“不好意思,想不起来了”。一点印象都没了,想憋都憋不出来啊。。。
一个简单的层次遍历,写着写着成了先序遍历。然后就死循环了。关键就是那一点未透——队列。
二叉树的层次遍历,是指从二叉树的第一层(根结点)开始,从上至下逐层遍历。在同一层中,则按从左到右的顺序对结点逐个访问。在进行层次遍历时,当前层结点访问完后,再按照它们的访问次序对各个结点的左孩子和右孩子顺序访问,这样一层一层进行,先遇到的结点先访问,这与队列的操作原则比较吻合。因此,在进行层次遍历时,可设置一个队列结构,遍历从二叉树的根结点开始,首先将根结点指针入队列,然后从对列头取出一个元素,每取一个元素,同时执行下面两个操作:
(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); } }
数据库不平,何以平天下,啊啊啊~
posted on 2012-05-06 15:37 hackergodness 阅读(4089) 评论(1) 编辑 收藏 举报