# morris traversal ###### tags: `BST` [173. Binary Search Tree Iterator](/ytl0bPnISjGFk4rSwjQRsQ) 1. spatial O(1) two space cur and node point(son node) 使用輔助pointer 1. 創造連結 當cur的left為null 表示到達目前的值組最小值 遞迴cur為cur.right and break(藉由以下自行link) 當cur的left不為null=>需要鏈結cur.left到cur 鏈結cur.left的right most node之right到cur cur=cur.left; loop情況會有兩種 1. 持續創建cur.left right most node 到 cur(新建link) 2. 發現cur.left right most node 的right為cur(需要拆除link 同時表示左側已經loop完畢 遞迴cur=cur.right break loop; 遞迴cur為cur.right(藉由自行link) 2. time O(2N) Morris 遍歷中每個節點會被訪問兩次,因此總時間複雜度為O(2n)=O(n) ```java= TreeNode cur, point; public BSTIterator(TreeNode root) { this.cur = root; } public int next() { int res = -1; point = cur; while (cur != null) { if (cur.left == null) { res = cur.val; cur = cur.right; break; } else { point = cur.left; //find rightest node or cycle while (point.right != null && point.right != cur) { point = point.right; } if (point.right == null) { //find rightest node and link point.right = cur; cur = cur.left; } else { // read second time and delete the link res = cur.val; point.right = null; cur = cur.right; break; } } } return res; } public boolean hasNext() { return cur != null; } ```