Skip to content

94. Binary Tree Inorder Traversal

Description

Given the root of a binary tree, return the inorder traversal of its nodes' values.

Example 1:

Input: root = [1,null,2,3]
Output: [1,3,2]

Example 2:

Input: root = [1,2,3,4,5,null,8,null,null,6,7,9]
Output: [4,2,6,5,7,1,3,9,8]

Example 3:

Input: root = []
Output: []

Example 4:

Input: root = [1]
Output: [1]

Constraints:

  • The number of nodes in the tree is in the range [0, 100].
  • -100 <= Node.val <= 100

Solutions

I Recursion

Complexity:

  • Time complexity: \(O(n)\), where \(n\) is the number of nodes in the tree.
  • Space complexity: \(O(h)\), where \(h\) is the height of the tree.
type TreeNode struct {
    Val   int
    Left  *TreeNode
    Right *TreeNode
}

func inorderTraversalRecursion(root *TreeNode, values *[]int) {
    if root == nil {
        return
    }
    inorderTraversalRecursion(root.Left, values)
    *values = append(*values, root.Val)
    inorderTraversalRecursion(root.Right, values)
}

// In-order traversal: left -> root -> right
func inorderTraversal(root *TreeNode) []int {
    values := make([]int, 0)
    inorderTraversalRecursion(root, &values)
    return values
}

II Iteration

Complexity:

  • Time complexity: \(O(n)\), where \(n\) is the number of nodes in the tree.
  • Space complexity: \(O(n)\), where \(n\) is the number of nodes in the tree.
type TreeNode struct {
    Val   int
    Left  *TreeNode
    Right *TreeNode
}

// In-order traversal: left -> root -> right
func inorderTraversalII(root *TreeNode) []int {
    values, stack, node := make([]int, 0), make([]*TreeNode, 0), root

    for node != nil || len(stack) > 0 {
        for node != nil {
            stack = append(stack, node)
            node = node.Left
        }

        if len(stack) > 0 {
            node = stack[len(stack)-1]
            stack = stack[:len(stack)-1]
            values = append(values, node.Val)
            node = node.Right
        }
    }

    return values
}