数据结构学习——二叉树的层次遍历:上下左右&下上右左

【上下左右】代表从上到下同时从左往右的遍历顺序,上下左右和下上右左其实是同一个问题。

1.上下左右遍历

上下左右遍历要借用到一个队列。

树根A第一个入栈,然后根结点的左右孩子BC紧随其后。front移动到A时把A访问并出队,接着front向队列后继续移动,在front不断后移的过程中,每移动到一个新的结点(队列中的一个空)就把这个结点的孩子lchild和rchild(如果有)再加入到队列中(先加左再加右)。这种入队循序保证了队列中高层的结点总在低层的前边,同一层中左边结点的总在右边的前面。

Void LevelOrder(BiTree T){
	InitQueue(Q);//创建队列
	BiTree p;//p当作光标
	EnQueue(Q,T);//首先把树的根结点入队,此步骤不在循环中
	while(!IsEmpty(Q)){//队列非空时循环
		DeQueue(Q,p);//把队头出队,同时把p标记到出队的那个结点上准备访问和入队其孩子
		visit(p);//↑此处直接用DeQueue()函数来出队是简略的写,实际其中包含front后移等操作
		if(p->lchild!=NULL)
			EnQueue(Q,p->lchild);
		if(p->rchild!=NULL)
			EnQueue(Q,p->rchild);
	}
}

2.下上右左遍历

实际上下上右左遍历的结果和上下左右遍历刚好是一个头尾相反的过程,在上下左右中我们每次循环用一次EnQueue()出队一个结点(以访问)并推进到队列中下一个结点,最终效果是把队列中元素按从头到尾输出了。既然下上右左是刚好相反的过程,那只用加一个栈,每次循环出队时把那个出队的结点再入栈,全部完成后正常输出栈,就变成了按队列从尾到头的顺序。

Void LevelOrder2(BiTree T){
	InitQueue(Q);
	InitStack(S);
	BiTree p;
	EnQueue(T);
	while(!IsEmpty(Q)){
		DeQueue(Q,p);
		Push(S,p);//把刚出队的p入栈
		visit(p);
		if(p->lchild!=NULL)
			EnQueue(Q,p->lchild);
		if(p->rchild)
			EnQueue(Q,p->rchild);
	}
	//然后出栈S,此处不考虑
}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值