二叉树、N叉树

37 阅读1分钟

可视化树: visualgo.net/zh/bst?slid…

二叉树前中后遍历

94. 二叉树的中序遍历

func inorderTraversal(root *TreeNode) []int {
    ans := []int{}
    helper(root, &ans)
    return ans
}

func helper(node *TreeNode, ans *[]int) {
    if node == nil {
        return
    }

    helper(node.Left, ans)
    *ans = append(*ans, node.Val)
    helper(node.Right, ans)
}

144. 二叉树的前序遍历

func preorderTraversal(root *TreeNode) []int {
    ans := []int{}
    helper(root, &ans)
    return ans
}

func helper(node *TreeNode, ans *[]int) {
    if node == nil {
        return
    }
    *ans = append(*ans, node.Val)
    helper(node.Left, ans)
    helper(node.Right, ans)
}

590. N 叉树的后序遍历

func postorder(root *Node) []int {
    ans := []int{}
    helper(root, &ans)
    return ans
}

func helper(node *Node, ans *[]int) {
    if node == nil {
        return
    }
    for _, children := range node.Children {
        helper(children, ans)
    }
    *ans = append(*ans, node.Val)
}

589. N 叉树的前序遍历

func preorder(root *Node) []int {
    ans := []int{}
    helper(root, &ans)
    return ans
}

func helper(node *Node, ans *[]int) {
    if node == nil {
        return
    }
    *ans = append(*ans, node.Val)
    for _, children := range node.Children {
        helper(children, ans)
    }
}

429. N 叉树的层序遍历

func levelOrder(root *Node) [][]int {
    ans := [][]int{}
    helper([]*Node{root}, &ans)
    return ans
}

func helper(nodes []*Node, ans *[][]int) {
    if len(nodes) == 0 || nodes[0] == nil {
        return
    }

    chils := []*Node{}
    vals := []int{}
    for _, node := range nodes {
        vals = append(vals, node.Val)
        chils = append(chils, node.Children...)
    }

    *ans = append(*ans, vals)
    helper(chils, ans)
}