static void Main(string[] args) { //PowerTreeNode root = new PowerTreeNode(1); //root.left = new PowerTreeNode(2); //root.right = new PowerTreeNode(3); //root.left.left = new PowerTreeNode(4); //root.right.left = new PowerTreeNode(5); //root.right.right = new PowerTreeNode(6); //root.left.left.left = new PowerTreeNode(7); LinkTreeNode linkRoot = new LinkTreeNode(1); linkRoot.left = new LinkTreeNode(2); linkRoot.right = new LinkTreeNode(3); linkRoot.left.left = new LinkTreeNode(4); linkRoot.right.left = new LinkTreeNode(5); linkRoot.right.right = new LinkTreeNode(6); linkRoot.left.left.left = new LinkTreeNode(7); linkRoot.right.right.left = new LinkTreeNode(8); Console.WriteLine(String.Join(" ", ZigZagTraversal.TraverseSimple(linkRoot))); //TreeNode simpleRoot = new TreeNode(1); //simpleRoot.left = new TreeNode(2); //simpleRoot.right = new TreeNode(3); //simpleRoot.left.left = new TreeNode(4); //simpleRoot.right.left = new TreeNode(5); //simpleRoot.right.right = new TreeNode(6); //simpleRoot.left.left.left = new TreeNode(7); //Console.WriteLine(String.Join(" ", ZigZagTraversal.TraverseWithSimpleNode(simpleRoot))); //int[] cards = new int[54]; //for (int i = 0; i < 54; i++) { // cards[i] = i; //} //ShuffleCard.Go(cards); //Console.WriteLine(String.Join(" ", cards)); Console.ReadLine(); }
// #2 in 1/29 discussion // O(1) space // change structure of node with link only in one direction public static List<int> TraverseSimple(LinkTreeNode root) { if (root == null) return new List<int>(); List<int> res = new List<int>(); LinkTreeNode curr = root; LinkTreeNode head = null; // head node in next level bool rightToLeft = true; // direction, view first level as from right to left // two children of current node waiting for linking LinkTreeNode p = null; LinkTreeNode q = null; while (curr != null) { res.Add(curr.val); p = rightToLeft ? curr.right : curr.left; q = rightToLeft ? curr.left : curr.right; // link children if (p != null) { if(head != null) { p.next = head; } head = p; } if (q != null){ if (head != null) { q.next = head; } head = q; } // move to next level if (curr.next == null) { curr.next = head; head = null; rightToLeft = !rightToLeft; } curr = curr.next; } return res; }