590 N叉树的后序遍历-简单

给定一个 n 叉树的根节点 root ,返回 其节点值的 后序遍历 。

n 叉树 在输入中按层序遍历进行序列化表示,每组子节点由空值 null 分隔(请参见示例)。

分析:

算法1:递归

// date 2022/10/12
func postorder(root *Node) []int {
    if root == nil {
        return []int{}
    }
    res := make([]int, 0, 16)
    for i := 0; i < len(root.Children); i++ {
        res = append(res, postorder(root.Children[i])...)
    }
    res = append(res, root.Val)
    return res
}

算法2:迭代【推荐该算法】

// date 2023/10/31
/**
 * Definition for a Node.
 * type Node struct {
 *     Val int
 *     Children []*Node
 * }
 */
func postorder(root *Node) []int {
    if root == nil {
        return []int{}
    }
    res := make([]int, 0, 16)
    stack := make([]*Node, 0, 16)
    stack = append(stack, root)
    visited := make(map[*Node]bool, 16)
    for len(stack) != 0 {
        cur := stack[len(stack)-1]
        // 如果当前节点为叶子节点,或者所有子结点已经遍历过,直接追加结果并更新栈
        if len(cur.Children) == 0 || visited[cur] {
            res = append(res, cur.Val)
            stack = stack[:len(stack)-1]
            continue
        }
        // 入栈当前节点的所有子结点
        for i := len(cur.Children)-1; i >= 0; i-- {
            if cur.Children[i] != nil {
                stack = append(stack, cur.Children[i])
            }
        }
        // 标记当前结点的所有子结点已经入栈
        visited[cur] = true
    }
    return res
}

最后更新于