二叉树的前中后序遍历-递归&非递归实现

二叉树的遍历口诀

前序:根左右

中序:左根右

后序:左右根

递归解法:

前序遍历:

《二叉树的前中后序遍历-递归&非递归实现》 前序遍历

中序遍历:

《二叉树的前中后序遍历-递归&非递归实现》 中序遍历

后序遍历:

《二叉树的前中后序遍历-递归&非递归实现》 后续遍历

递归解法很简单,对应“根左右”,“左根右”,“左右根”,三个口诀,递归的代码的位置不同。

非递归解法,内在的原理和递归解法是相同的,只不过通过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进来,代表该节点左右均遍历完。

《二叉树的前中后序遍历-递归&非递归实现》 后续非递归实现

    原文作者:张崩崩得了懒癌
    原文地址: https://www.jianshu.com/p/4d6c7f301de7
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞