二叉树的遍历口诀
前序:根左右
中序:左根右
后序:左右根
递归解法:
前序遍历:
中序遍历:
后序遍历:
递归解法很简单,对应“根左右”,“左根右”,“左右根”,三个口诀,递归的代码的位置不同。
非递归解法,内在的原理和递归解法是相同的,只不过通过while循环来代替了递归。
前序遍历:
实现思路:
对于任一节点P,(理解了就很容易背下来)
1)输出节点P,然后将其入栈,再看P的左孩子是否为空;
2)若P的左孩子不为空,则置P的左孩子为当前节点,重复1)的操作;
3)若P的左孩子为空,则将栈顶节点出栈,但不输出,并将出栈节点的右孩子置为当前节点,看其是否为空;
4)若不为空,则循环至1)操作;
5)如果为空,则继续出栈,但不输出,同时将出栈节点的右孩子置为当前节点,看其是否为空,重复4)和5)操作;
6)直到当前节点P为NULL并且栈空,遍历结束。
中序遍历:
对于任一节点P,
1)若P的左孩子不为空,则将P入栈并将P的左孩子置为当前节点,然后再对当前节点进行相同的处理;
2)若P的左孩子为空,则输出P节点,而后将P的右孩子置为当前节点,看其是否为空;
3)若不为空,则重复1)和2)的操作;
4)若为空,则执行出栈操作,输出栈顶节点,并将出栈的节点的右孩子置为当前节点,看起是否为空,重复3)和4)的操作;
5)直到当前节点P为NULL并且栈为空,则遍历结束。
后续遍历:
对于任一节点P,维护连个栈,第一个的作用同上,第二个的作用用来标识某个节点的左右子树是否全部遍历完成。
1)先将节点P入栈stack1;stack2同时入栈0。
2)否含有左子节点,如果有则继续执行1)操作。
3)如果没有,检查stack1是否为空并且stack2栈顶为1。
4)如果3)不满足,则获取stack1的值,不出栈,并且设置当前node为stack1栈顶值,同时stack2栈顶出栈,同时push 1进来,代表该节点左右均遍历完。