/* Convert a binary search tree to doubly linked list with in-order traversal. Example Given a binary search tree: 4 / \ 2 5 / \ 1 3 return 1<->2<->3<->4<->5 Tags Expand Linked List */
/* Thoughts: Inorder with 1 stack: peek add left till end, pop and add, then push right node. Everytime when pop out a node and add, make it a new boubllistnode dNode.next = curr curr.pre = dNode.next dNode = dNode.next boarder case: if null, return a null. */ public class Solution { public DoublyListNode bstToDoublyList(TreeNode root) { if (root == null) { return null; } //Init stack Stack<TreeNode> stack = new Stack<TreeNode>(); TreeNode node = root; stack.push(node); //Create DoublyListNode header DoublyListNode dummy = new DoublyListNode(0); DoublyListNode dNode = dummy; while(!stack.isEmpty()) { while (node != null && node.left != null) { stack.push(node.left); node = node.left; } //add node node = stack.pop(); DoublyListNode curr = new DoublyListNode(node.val); dNode.next = curr; curr.prev = dNode; dNode = dNode.next; //check right node and add to stack node = node.right; if (node != null) { stack.push(node); } } return dummy.next; } }