public ArrayList<Integer> inorderTraversal(TreeNode root) {
		ArrayList<Integer> list = new ArrayList<Integer>();
		if(root == null) return list;
		
		Stack<TreeNode> stack = new Stack<TreeNode>();
		Map<TreeNode, Boolean> map = new HashMap<TreeNode, Boolean>();
		stack.add(root);
		
		while(stack.size() > 0) {
			TreeNode node = stack.pop();
			if(!map.containsKey(node)) { // expand
				map.put(node, false);
				if(node.right != null) stack.add(node.right);
				stack.add(node);
				if(node.left != null) stack.add(node.left);
			} else if(!map.get(node)){ // output
				map.put(node, true);
				list.add(node.val);
			}
		}
		return list;
	}