This is a "In Order" traversal problem, because the order of the result is a in order or the tree.
1. The problem need to return the pointer to the smallest element of the linked list, so we first need to find the smallest element.
2. The problem requires "We want to do the transformation in place", that mean we should not create a new link.
3. We need a "pre-node" to indicate the last node that was just traversed before the current node.
The solution is as following, time complexity is O(n):
private Node pre = new Node(); //3. pre-node public Node treeToDoublyList(Node root) { if(root==null) return null; Node head = root; while(head.left!=null){ head = head.left; //1. find the smallest element } inOrder(root); pre.right = head; head.left = pre; return head; } private void inOrder(Node root){ //2. in place if(root == null) return; inOrder(root.left); pre.right = root; root.left = pre; pre = root; inOrder(root.right); }