145. Binary Tree Postorder Traversal ⭐

Easy

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

Example 1:

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

Example 2:

Input: root = []
Output:
 []

Example 3:

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

Constraints:

  • The number of the nodes in the tree is in the range [0, 100].

  • -100 <= Node.val <= 100

Follow up: Recursive solution is trivial, could you do it iteratively?

解題

這題和 144 是姐妹題。

Recursive 解法:

/**
 * Definition for a binary tree node .
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func postorderTraversal(root *TreeNode) []int {
    res := make([]int, 0)

    var helper func(*TreeNode)
    helper = func(root *TreeNode) {
        if root == nil { return }

        helper(root.Left)
        helper(root.Right)
        res = append(res, root.Val)
    }

    helper(root)

    return res
}

使用 stack 與 for loop

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func postorderTraversal(root *TreeNode) []int {
    ans := make([]int, 0)
    if root == nil { return ans }
    
    stack := make([]*TreeNode, 0)
    stack = append(stack, root)

    for len(stack) > 0 {
        node := stack[len(stack)-1]
        
        if node.Right == nil && node.Left == nil {
            stack = stack[:len(stack)-1]
            ans = append(ans, node.Val)
        }

        if node.Right != nil {
            stack = append(stack, node.Right)
            node.Right = nil
        }

        if node.Left != nil {
            stack = append(stack, node.Left)
            node.Left = nil
        } 
    }

    return ans
}

Last updated