摘要
非递归遍历的重点是刷新当前节点和记录每个节点的访问情况(左子树,右子树是否被访问),如果刷新当前节点统一为栈顶,思路就会很清晰,代码就会很简洁。
经典题目之非递归中序遍历:
左中右
思考:每次访问当前元素时,需要保证左子树已经被访问,所以保留一个左子树被访问标记
Stack<Node,左子树访问标志>
每次访问栈顶:
如果栈顶左子树没被访问过,修改左子树访问标值为已防问,压栈,左子树压栈
如果栈顶左子树被访问过了,访问栈顶元素,右子树压栈
此代码非常简洁
经典题目之非递归先序遍历:
中左右
每次访问栈顶
访问栈顶,右子树不为空压栈右子树,左子树不为空压栈左子树
经典题目之非递归后序遍历:
解法一:左右中 倒过来就是 中右左,可以先用先序遍历得到中右左,然后reverse即可
解法二:左右中 ,这不就是331那个题吗?
思考:这种访问方式和331和中序很像,结合二者,每次访问元素时需要保证左子树被访问、右子树被访问,所以添加一个右子树被访问标记
Stack<Node,右子树访问标记>
当前元素为树根
当前元素不为空,当前元素左子树循环压栈(右子树访问标值置flase)(这样保证左子树被访问),直到遇见左子树为空的节点,该节点压栈(右子树访问标值true),当前元素为该节点右子树
如果当前元素为null,当前元素等于栈顶,如果栈顶右子树访问标记为true:访问,弹栈;为false:标记为true压栈,当前元素等于右子树,进入下一次循环

4875

被折叠的 条评论
为什么被折叠?



