/*
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;
}
}