n树遍历,前序、后序、层序

    前序遍历

    1. /**
    2. * Definition for a Node.
    3. * type Node struct {
    4. * Val int
    5. * Children []*Node
    6. * }
    7. */
    8. //递归
    9. func preorder(root *Node) []int {
    10. res := []int{}
    11. if root == nil {
    12. return res
    13. }
    14. res = append(res,root.Val)
    15. for _, node := range root.Children {
    16. res = append(res,preorder(node)...)
    17. }
    18. return res
    19. }
    20. //迭代
    21. func preorder(root *Node) []int {
    22. res := []int{}
    23. if root == nil {
    24. return res
    25. }
    26. stack := []*Node{root}
    27. for len(stack) > 0 {
    28. node := stack[len(stack)-1]
    29. stack = stack[:len(stack)-1]
    30. res = append(res,node.Val)
    31. for i:=len(node.Children)-1;i>=0;i-- {
    32. stack = append(stack,node.Children[i])
    33. }
    34. }
    35. return res
    36. }

    后序遍历

    /**
     * Definition for a Node.
     * type Node struct {
     *     Val int
     *     Children []*Node
     * }
     */
    // 递归
    func postorder(root *Node) []int {
        res := []int{}
        if root == nil {
            return res 
        }
        for _,node := range root.Children {
            res = append(res,postorder(node)...)
        }
        res = append(res,root.Val)
    
        return res  
    }
    
    // 迭代 
    func postorder(root *Node) []int {
        res := []int{}
        stack :=[]*Node{root}
        if root == nil {
            return res 
        }
        for len(stack) >0 {
            node := stack[len(stack)-1]
            stack = stack[:len(stack)-1]
            res = append(res,node.Val)
            for _, no := range node.Children {
                stack = append(stack,no)
            }
        }
        for i:=0;i< len(res)/2;i++ {
            res[i],res[len(res)-1-i] = res[len(res)-1-i],res[i]
        }
        return res  
    }
    

    层级遍历

    
    
    /**
     * Definition for a Node.
     * type Node struct {
     *     Val int
     *     Children []*Node
     * }
     */
    
    // 递归 
    
    var res [][]int 
    func levelOrder(root *Node) [][]int {
        res = make([][]int,0)
        if root == nil {
            return res
        }
        dfs(root,0)
        return res
    }
    
    func dfs(root *Node,level int) {
        if root == nil {
            return 
        }
        if len(res) == level {
            res = append(res,[]int{})
        }
        res[level] = append(res[level],root.Val)
        for _, child := range root.Children {
            dfs(child,level+1)
        }
    }
    
    
    //迭代 
    func levelOrder(root *Node) [][]int {
        res := [][]int{}
        if root == nil {
            return res 
        }
        queue := []*Node{}
        queue = append(queue,root)
        for len(queue) >0 {
            length := len(queue) 
            ress := []int{}
            for length >0 {
                node := queue[0]
                queue = queue[1:]
                ress = append(ress,node.Val)
                length-- 
                for _,child := range node.Children {
                    queue = append(queue,child)
                }
            }
            res = append(res,ress)
        }
        return res 
    }