一、算法介绍
Morris算法充分利用了二叉树叶子结点下的空间,从而可以在时间复杂度为O(N),空间复杂度为O(1)的条件下,前中后序遍历二叉树(不是完全二叉树也可以使用)。
而常见的遍历二叉树的方法为递归和栈迭代,这两种方法的时间复杂度虽然也为O(N),但是空间复杂度需要O(N),因此Morris算法可以极大节省空间。
二、算法原理
首先来到当前结点记为cur。
1.如果cur无左孩子,cur向右移动。
2.如果cur有左孩子,那么找到cur左子树的最右的结点,记为mostRight。
2.1如果mostRight的right指针指向空,则让其指向cur,然后cur向左移动
2.2如果mostRight的right指针指向cur,让其指回空,然后cur向右移动。
三、算法实现
var inOrder3= function (root) { if(root === null) return; let cur = root; let res = []; while(cur){ if(cur.left === null){ res.push(cur.val); cur = cur.right; }else{ let node = cur.left; while(node!==null && node.right !== null && node.right !== cur){ node=node.right; } if(node.right === null){ node.right = cur; cur = cur.left; }else{ node.right = null; res.push(cur.val); cur = cur.right; } } } return res; };
var preOrder3= function (root) { if(root == null) return; let cur = root; let res = []; while(cur){ if(cur.left === null){ res.push(cur.val); cur = cur.right; }else{ let node = cur.left; while(node!==null && node.right !== null && node.right !== cur){ node=node.right; } if(node.right === null){ res.push(cur.val); node.right = cur; cur = cur.left; }else{ node.right = null; cur = cur.right; } } } return res; };
var postOrder3= function (root) {