【清晰明了】非递归算法实现二叉树的遍历

遍历二叉树的路线是从根节点开始沿左子树深入下去,当深入到最左端,无法再深入下去时,再返回,再逐一进入刚才深入时遇到节点的右子树,再进行如此的深入和返回,知道最后从根节点的右子树返回到根节点位置。
先序遍历是在深入时遇到结点就访问,中序遍历是在从左子树返回时遇到结点就访问,后序遍历是从右子树返回时遇到结点就访问

//先序遍历
while(栈非空或者p非空){
	while(栈非空){
	访问;
	入栈;
	p往所在节点的左子树移动;
}
	出栈;
	往右;
}

这里先留坑,以后附上java实现的代码。

//中序遍历
while(栈非空或者p非空){
	while(栈非空){
	
	入栈;
	p往所在节点的左子树移动;
}
	出栈;
	访问; //即把访问移动到 出栈 和 往右子树移动 之间
	往右;
}

这里先留坑,以后附上java实现的代码。

后序与前中不同,后序是每个节点要 入栈两次,当然第二次的入栈不是真的出栈然后入栈操作,只是记录一下就好。
这个记录可以给每个节点加一个计数器来实现,也可将第二次的地址设为负的,通过节点正负来判断是之前访问了几次。

后序遍历,简单来说就是:
第一次入栈,不访问设为1,往左子树走;
左子为空,回来,设为2,往右子树走;
右子为空,回来,发现为2,访问;

while(p){
	入栈(第一次)
		往左子树移动;
		}
	出栈 if(第一次){
			入栈(第二次)
				计时器设为2 或者地址设为负}
		else{
		访问, p=null }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值