二叉树的遍历分前序、中序、后序遍历,实现可以用递归版和非递归版本,正常的遍历都需要使用额外的栈空间来辅助,额外空间复杂度为O(h) h为二叉树高度,mirros遍历则可以充分利用空间,额外空间复杂度为O(1)来实现前序、中序和后序遍历。
递归
三种遍历方式,递归程序都一样,只是打印时机不一样。
非递归
前序遍历:遍历顺序为中左右,这里使用栈结构来辅助,放入头节点,弹出之间打印,再把右节点放到栈里,再放左节点,弹出的顺序则会先弹左,再弹右
中序遍历:遍历顺序为左中右,这里使用栈结构来辅助
后序遍历:遍历顺序为左右中,这里使用双栈结构来辅助,先实现中右左,然后节点放入到另一个栈中,依次弹出就是左右中了。中右左和前序遍历的代码类似。
mirros遍历
mirros遍历主要是利用了叶子节点为null的引用位置,从而避免新使用栈结构。
mirros的流程主要有三种情况:
1、当前节点无左孩子,当前节点向右移动
2、当前节点有左孩子,当前节点左子树上最右的节点的右孩子为空,让其指向当前节点,节点左移
3、当前节点有左孩子,当前节点左子树上最右的节点的右孩子当前节点,让其指向空,节点右移
这个就是mirros遍历的流程代码,至于三种遍历方式的实现只是打印时机不一样,这和递归方式类似。
递归每个节点都会访问三次的,前序遍历就是第一次遇到就打印,中序遍历就是第二次遇到打印,后序遍历是第三次遇到打印
前序遍历:和递归类似,第一次遇到节点就打印。mirros第一次遇到节点分为两种情况:一种是没有左子树;一种是左子树的最右孩子为空
中序遍历:和递归类似,第二次遇到节点就打印。没有左子树话第一次和第二次是同一时刻,有左子树第二次是当左子树都处理完,当前节点右移的时候
后序遍历:mirros有左孩子的节点会经过两次,没有左子树的节点只会经过一次,所有永远不会有第三次经过,这时候我们不用管只经过一次的节点,就是没有左子树的节点。我们只需要在第二次经过节点的时候,逆序打印左子树的右边界。最后打印下整棵树的右边界。
希望对大家有所帮助,有帮助记得点赞哦!可以关注下,后面持续分享编程类的文章,谢谢!