public void Given_Tree_When_FindLargestValues_Then_ShouldReturnLargestValues()
        {
            //Given
            var problem        = new Leetcode_515_FindLargestValueInEachTreeRow_V1();
            var expectedResult = new int[] { 1, 3, 7 };
            var tree           = new TreeNode515(1);

            var node11 = new TreeNode515(2);
            var node12 = new TreeNode515(3);

            tree.Left  = node11;
            tree.Right = node12;

            var node21 = new TreeNode515(4);
            var node22 = new TreeNode515(5);

            node11.Left  = node21;
            node11.Right = node22;

            var node23 = new TreeNode515(6);
            var node24 = new TreeNode515(7);

            node12.Left  = node23;
            node12.Right = node24;

            //When
            var actualResult = problem.FindLargestValues(tree);

            //Then
            Assert.AreEqual(expectedResult.Length, actualResult.Count);
            for (var i = 0; i < expectedResult.Length; i++)
            {
                Assert.AreEqual(expectedResult[i], actualResult[i]);
            }
        }
        public IList <int> FindLargestValues(TreeNode515 root)
        {
            var largestValues = new List <int>();
            var buffer        = new Queue <(int level, TreeNode515 node)>();
            var currentLevel  = 0;

            buffer.Enqueue((0, root));
            largestValues.Add(root.Value);
            while (buffer.Count > 0)
            {
                var currentItem = buffer.Dequeue();
                var currentNode = currentItem.node;
                if (currentItem.level > currentLevel)
                {
                    currentLevel = currentItem.level;
                    largestValues.Add(currentNode.Value);
                }
                else
                {
                    if (currentNode.Value > largestValues[currentLevel])
                    {
                        largestValues[currentLevel] = currentNode.Value;
                    }
                }
                if (currentNode.Left != null)
                {
                    buffer.Enqueue((currentItem.level + 1, currentNode.Left));
                }
                if (currentNode.Right != null)
                {
                    buffer.Enqueue((currentItem.level + 1, currentNode.Right));
                }
            }
            return(largestValues);
        }