Binary Tree Inorder Traversal

easy tree dfs stack

Problem

Given the root of a binary tree, return the inorder traversal of its node values (left subtree, then root, then right subtree).

Inputroot = [1, null, 2, 3]
Output[1, 3, 2]
Inorder visits 1 (root), then descends right to 2, but first emits its left child 3 → [1, 3, 2].

def inorder_traversal(root):
    out, stack, node = [], [], root
    while node or stack:
        while node:
            stack.append(node)
            node = node.left
        node = stack.pop()
        out.append(node.val)
        node = node.right
    return out
function inorderTraversal(root) {
  const out = [], stack = [];
  let node = root;
  while (node || stack.length) {
    while (node) { stack.push(node); node = node.left; }
    node = stack.pop();
    out.push(node.val);
    node = node.right;
  }
  return out;
}
class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> out = new ArrayList<>();
        Deque<TreeNode> stack = new ArrayDeque<>();
        TreeNode node = root;
        while (node != null || !stack.isEmpty()) {
            while (node != null) { stack.push(node); node = node.left; }
            node = stack.pop();
            out.add(node.val);
            node = node.right;
        }
        return out;
    }
}
vector<int> inorderTraversal(TreeNode* root) {
    vector<int> out;
    stack<TreeNode*> st;
    TreeNode* node = root;
    while (node || !st.empty()) {
        while (node) { st.push(node); node = node->left; }
        node = st.top(); st.pop();
        out.push_back(node->val);
        node = node->right;
    }
    return out;
}
Time: O(n) Space: O(h)