• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

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

武飞扬头像
花间半盘棋
帮助1

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

分析:如图有一棵二叉树,按照层次遍历最终的结果就是ABCDEFG,首先将根结点A入队列。
学新通
然后根结点出队,并访问A结点,发现A结点既有左孩子也有右孩子,那么就分别将左右孩子入队,此时队列中有BC。
学新通
A的左右孩子都入队了,然后将队头结点B出队并访问,此时序列为AB,B有左右孩子,所以将B的左右孩子DE入队,队中此时有CDE。学新通
然后队头结点C出队并访问,C有左右孩子,所以将C的左右孩子FG入队。此时队列里有DEFG。
学新通
然后队头结点D出队并访问,D没有左右孩子,所以没有可入队的结点。
继续让队头结点E出队并访问,E没有左右孩子,所以没有可入队的结点。
FG同理,此时队列为空,结束。最终层次遍历序列为:ABCDEFG。
学新通

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

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);  // 就将右孩子入队
	}
}

注解
学新通

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgggcif
系列文章
更多 icon
同类精品
更多 icon
继续加载