|  | @@ -0,0 +1,55 @@
 | 
	
		
			
				|  |  | +/**
 | 
	
		
			
				|  |  | + * Definition for a binary tree node.
 | 
	
		
			
				|  |  | + * type TreeNode struct {
 | 
	
		
			
				|  |  | + *     Val int
 | 
	
		
			
				|  |  | + *     Left *TreeNode
 | 
	
		
			
				|  |  | + *     Right *TreeNode
 | 
	
		
			
				|  |  | + * }
 | 
	
		
			
				|  |  | + */
 | 
	
		
			
				|  |  | +func largestValues(root *TreeNode) (res []int) {
 | 
	
		
			
				|  |  | +	preorder(root, 0, &res) // DFS
 | 
	
		
			
				|  |  | +	return
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +func preorder(root *TreeNode, depth int, res *[]int) {
 | 
	
		
			
				|  |  | +	if root == nil {
 | 
	
		
			
				|  |  | +		return
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +	if depth == len(*res) {
 | 
	
		
			
				|  |  | +		*res = append(*res, root.Val)
 | 
	
		
			
				|  |  | +	} else if (*res)[depth] < root.Val {
 | 
	
		
			
				|  |  | +		(*res)[depth] = root.Val
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +	preorder(root.Left, depth+1, res)
 | 
	
		
			
				|  |  | +	preorder(root.Right, depth+1, res)
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +func largestValuesBFS(root *TreeNode) (res []int) {
 | 
	
		
			
				|  |  | +	if root == nil {
 | 
	
		
			
				|  |  | +		return
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +	queue := make([]*TreeNode, 0)
 | 
	
		
			
				|  |  | +	queue = append(queue, root)
 | 
	
		
			
				|  |  | +	size := 1
 | 
	
		
			
				|  |  | +	for size != 0 {
 | 
	
		
			
				|  |  | +		max, l := queue[0].Val, size
 | 
	
		
			
				|  |  | +		for i := 0; i < l; i++ {
 | 
	
		
			
				|  |  | +			node := queue[0]
 | 
	
		
			
				|  |  | +			queue = queue[1:]
 | 
	
		
			
				|  |  | +			size--
 | 
	
		
			
				|  |  | +			if max < node.Val {
 | 
	
		
			
				|  |  | +				max = node.Val
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +			if node.Left != nil {
 | 
	
		
			
				|  |  | +				queue = append(queue, node.Left)
 | 
	
		
			
				|  |  | +				size++
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +			if node.Right != nil {
 | 
	
		
			
				|  |  | +				queue = append(queue, node.Right)
 | 
	
		
			
				|  |  | +				size++
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +		res = append(res, max)
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +	return
 | 
	
		
			
				|  |  | +}
 |