树的前中后序非递归遍历

摘要

非递归遍历的重点是刷新当前节点和记录每个节点的访问情况(左子树,右子树是否被访问),如果刷新当前节点统一为栈顶,思路就会很清晰,代码就会很简洁。

经典题目之非递归中序遍历:
左中右
思考:每次访问当前元素时,需要保证左子树已经被访问,所以保留一个左子树被访问标记

Stack<Node,左子树访问标志> 
每次访问栈顶:
	如果栈顶左子树没被访问过,修改左子树访问标值为已防问,压栈,左子树压栈
	如果栈顶左子树被访问过了,访问栈顶元素,右子树压栈
此代码非常简洁

经典题目之非递归先序遍历:
中左右

每次访问栈顶
	访问栈顶,右子树不为空压栈右子树,左子树不为空压栈左子树

经典题目之非递归后序遍历:
解法一:左右中 倒过来就是 中右左,可以先用先序遍历得到中右左,然后reverse即可
解法二:左右中 ,这不就是331那个题吗?
思考:这种访问方式和331和中序很像,结合二者,每次访问元素时需要保证左子树被访问、右子树被访问,所以添加一个右子树被访问标记

Stack<Node,右子树访问标记>
	当前元素为树根
	当前元素不为空,当前元素左子树循环压栈(右子树访问标值置flase)(这样保证左子树被访问),直到遇见左子树为空的节点,该节点压栈(右子树访问标值true),当前元素为该节点右子树
	如果当前元素为null,当前元素等于栈顶,如果栈顶右子树访问标记为true:访问,弹栈;为false:标记为true压栈,当前元素等于右子树,进入下一次循环
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值