递归遍历
func preorderV1(root *NodeC) []int {
  list:=list.New()
  t(root,list)
  var a []int
  for list.Len()>0{
    vl:=list.Remove(list.Front()).(int)
    a=append(a, vl)
  }
  return a
}
func t(root *NodeC, res *list.List) *list.List {
  if root==nil{
    return list.New()
  }
  res.PushBack(root.Val)
  for _,node := range root.Children {
    t(node,res)
  }
  return res
}层序遍历
思路:
在前序遍历中,我们会先遍历节点本身,然后从左向右依次先序遍历该每个以子节点为根的子树,此时利用栈先进后出的原理,依次从右向左将子节点入栈,这样出栈的时候即可保证从左向右依次遍历每个子树。参考方法二的原理,可以提前将后续需要访问的节点压入栈中,这样就可以避免记录每个节点的子节点访问数量。
//前序遍历
func preorder(root *NodeC) []int {
  var res []int
  if root==nil{
    return nil
  }
  arr:=[]*NodeC{root}//根节点压入栈
  for len(arr)>0 {
    temp:=arr[len(arr)-1]//获取栈尾数据
    arr=arr[:len(arr)-1]//并删除栈尾数据
    res=append(res, temp.Val)
    cl:=len(temp.Children)//获取子节点的长度,因前序遍历,根左右,先添加右节点再添加左节点,故倒序添加(右左)压入栈
    for i := cl-1; i > 0; i-- {
      arr=append(arr, temp.Children[i])
    }
  }
  return res
}









