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

二叉树的遍历口诀

前序:根左右

中序:左根右

后序:左右根


递归解法:

前序遍历:


前序遍历

中序遍历:


中序遍历

后序遍历:


后续遍历

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


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


后续非递归实现
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容