给你一个整数数组 nums ,请你找出 nums 子集 按位或 可能得到的 最大值 ,并返回按位或能得到最大值的 不同非空子集的数目 。 如果数组 a 可以由数组 b 删除一些元素(或不删除)得到,则认为数组 a 是数组 b 的一个 子集 。如果选中的元素下标位置不一样,则认为两个子集 不同 。 对数组 a 执行 按位或 ,结果等于 a[0] OR a[1] OR … OR a[a.length - 1](下标从 0 开始)。
每次查看栈顶元素 p,如果节点 p 的子节点已经全部访问过,则将节点 p 的从栈中弹出,并从哈希表中移除,表示该以该节点的子树已经全部遍历过;如果当前节点 p 的子节点还有未遍历的,则将当前节点的 p 的下一个未访问的节点压入到栈中,重复上述的入栈操作。
代码1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
funcpreorder(root *Node) []int { // var p *[]int 直接会报空指针错误 // var ans []int; var p *[]int = &ans也可 ans := make([]int,0) p := &ans preOrderTraverse(root,p) return ans }
funcpreOrderTraverse(root *Node,p *[]int){ if root==nil{ return } *p = append(*p,root.Val) for _,node:=range root.Children{ preOrderTraverse(node,p) } }