剑指offer
二叉树的遍历
先序遍历(非递归版使用栈来实现):1、申请一个栈,将头结点压入栈中 cur = head;2、从栈中弹出栈顶元素cur并打印,再将cur的右子节点(不为空的话)压入栈中,最后将cur的左孩子节点(不为空的话)压入栈中;3、重复2步骤,直到stack为空。
中序遍历(非递归版使用栈来实现):1、申请一个栈,将头结点压入栈中,cur = head;2、依次将左边界压入栈中cur = cur.left;3、重复2,直到cur为空,从stack中弹出一个元素,记为node,并打印;且cur = node.right,重复过程2;4、stack为空且cur为空时,这个过程停止。
后序遍历:(方法一用两个栈实现,先序遍历的逻辑;方法二用一个栈实现,记录稍复杂)
方法一:用两个栈实现,一个栈stack1实现类似先序遍历(进头结点,弹出;依次进左、右,弹出;),只不过弹出时不打印,弹出到stack2中,最后从stack2中依次弹出并打印。
方法二:1、申请一个栈,将头结点压入栈中;设置两个变量cur和had,cur表示当前栈顶元素,had表示前一个弹出栈顶的元素;
2、每次令cur为当前栈顶的节点;分为以下三种情况处理:i)cur的左孩子不为空,且had不是cur的左孩子,也不是cur的右孩子,则将cur的左孩子压入栈中;ii)如果i情况不成立,且cur的右孩子不为空,且had不是cur的右孩子,则将cur的右孩子压入栈中;iii)如果i和ii条件均不成立,说明cur的左孩子和右孩子均已打印完毕,则从stack中弹出cur并打印,然后令had = cur;
3、一直重复步骤2在,直到stack为空。
层次遍历(宽度优先遍历,使用一个队列来实现):1、申请一个队列,头结点进队列 cur = head;2、cur出队列,并打印;将cur的左子树和右子树依次进队列(不为空的情况下)3、重复步骤2直到队列为空。
深度优先遍历(就是上面的前序、中序、后序遍历):使用栈来实现