本质上是inorder的traversal。把当前结点的左儿子的最右的叶子结点(也就是在inorder顺序上,当前结点的前一个结点)的右结点指向当前。当第2次到达这个结点的时候,可以重新给断开
时间跟空间都是 O(1)
void morris(TreeNode root) { TreeNode cur = root, pre = null; while (cur != null) { if (cur.left != null) { pre = cur.left; while (pre.right != null && pre.right != cur) { pre = pre.right; } if (pre.right == null) { pre.right = cur; cur = cur.left; }else { System.out.println(cur.val); cur = cur.right; pre.right = null; } }else { System.out.println(cur.val); cur = cur.right; } } }
Morris traversal iterator public class OA { public static void main(String[] ss) { Node n50 = new Node(50); Node n40 = new Node(40); Node n30 = new Node(30); Node n1 = new Node(1); Node n35 = new Node(35); Node n45 = new Node(45); Node n60 = new Node(60); Node n55 = new Node(55); n50.left = n40; n50.right = n60; n60.left = n55; n40.left = n30; n40.right = n45; n30.left = n1; n30.right = n35; MoItr itr = new MoItr(n50); for (int i = 0; i < 8; i++) { System.out.println(itr.next()); } } static class MoItr{ private Node root; public MoItr(Node root) { this.root = root; } public int next() { while (root != null) { if (root.left != null) { Node pre = root.left; while (pre.right != null && root != pre.right) { pre = pre.right; } if (pre.right == null) { pre.right = root; root = root.left; }else { int rt = root.val; pre.right = null; root = root.right; return rt; } }else { int rt = root.val; root = root.right; return rt; } } return -1; } } }
No comments:
Post a Comment