Inorder traversal is left->root->right so we need to visit all left nodes first, if they exist before printing the current node and then visiting the right.

-Keep a flag to determine if the left has already been visited.

-If not, insert the currentnode back into the stack, and insert it's left node(if it exist) ontop of the stack. Mark the currentnode as having visited left.

-If the currentnode has visited left, add its value to the result array, and insert it's right node if it exists.

```
```class Solution(object):
def inorderTraversal(self, root):
if root is None:
return []
visited_left, res, stack = dict(), [], [root]
while stack:
n = stack.pop(0)
if n not in visited_left:
visited_left[n] = True
stack.insert(0, n)
if n.left:
stack.insert(0, n.left)
else:
res.append(n.val)
if n.right:
stack.insert(0,n.right)
return res ```
```