递归遍历
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
}