二叉树:层次遍历算法(自上而下,从左到右)

层次遍历(LevelOrder)就是默认为自上而下,从左到右,一层一层进行遍历
层次遍历需要借助队列来完成,
队列:先进先出(FIFO

分析:如图有一棵二叉树,按照层次遍历最终的结果就是ABCDEFG,首先将根结点A入队列。
二叉树:层次遍历算法(自上而下,从左到右)_第1张图片
然后根结点出队,并访问A结点,发现A结点既有左孩子也有右孩子,那么就分别将左右孩子入队,此时队列中有BC。
二叉树:层次遍历算法(自上而下,从左到右)_第2张图片
A的左右孩子都入队了,然后将队头结点B出队并访问,此时序列为AB,B有左右孩子,所以将B的左右孩子DE入队,队中此时有CDE。二叉树:层次遍历算法(自上而下,从左到右)_第3张图片
然后队头结点C出队并访问,C有左右孩子,所以将C的左右孩子FG入队。此时队列里有DEFG。
二叉树:层次遍历算法(自上而下,从左到右)_第4张图片
然后队头结点D出队并访问,D没有左右孩子,所以没有可入队的结点。
继续让队头结点E出队并访问,E没有左右孩子,所以没有可入队的结点。
FG同理,此时队列为空,结束。最终层次遍历序列为:ABCDEFG。
二叉树:层次遍历算法(自上而下,从左到右)_第5张图片

算法思想:层次遍历使用一个队列(先进先出),将根结点入队,出队,然后访问出队结点,若它有左孩子,就将左孩子入队,若它有右孩子,就将右孩子入队,然后访问队头结点,如此循环下去,直到队列为空,就结束了。
代码

void LevelOrder(BiTree T){  // 全篇❤
	InitQueue(Q); // 初始化队列Q,队列通常用Q表示,栈用S表示
	BiTree *p;
	EnQueue(Q,T); // 将根结点入队
	while(!IsEmpty(Q)){ // 队列不为空则进入循环
		DeQueue(Q,p);  // 出队,即将队头结点出队,因为队列先进先出
		visit(p);  // 并访问,即加入到最终遍历序列中
		if(p->lchild!=NULL)  // 如果有左孩子
			EnQueue(Q,p->lchild);  // 就将左孩子入队
		if(p->rchild!=NULL)  // 如果有右孩子
			EnQueue(Q,p->rchild);  // 就将右孩子入队
	}
}

注解
二叉树:层次遍历算法(自上而下,从左到右)_第6张图片

你可能感兴趣的:(数据结构,算法,b树,数据结构)