private static NodeWithNext ConnectLevelOrderSiblingsV2(NodeWithNext root)
        {
            var nodes = new Queue <NodeWithNext>();

            nodes.Enqueue(root);
            NodeWithNext previous = null;

            while (nodes.Count > 0)
            {
                var current = nodes.Dequeue();
                if (previous == null)
                {
                    previous = current;
                }
                else
                {
                    previous.Next = current;
                    previous      = current;
                }

                if (current.Left != null)
                {
                    nodes.Enqueue(current.Left);
                }
                if (current.Right != null)
                {
                    nodes.Enqueue(current.Right);
                }
            }

            return(root);
        }
        private static NodeWithNext ConnectLevelOrderSiblings(NodeWithNext root)
        {
            var nodes = new Queue <NodeWithNext>();
            var temp  = new Queue <NodeWithNext>();

            nodes.Enqueue(root);
            while (nodes.Count > 0 || temp.Count > 0)
            {
                if (nodes.Count == 0)
                {
                    nodes = temp;
                    temp  = new Queue <NodeWithNext>();
                }
                else
                {
                    var current = nodes.Dequeue();
                    if (nodes.Count > 0)
                    {
                        current.Next = nodes.Peek();
                    }

                    if (current.Left != null)
                    {
                        temp.Enqueue(current.Left);
                    }
                    if (current.Right != null)
                    {
                        temp.Enqueue(current.Right);
                    }
                }
            }

            return(root);
        }
        public static void Print(NodeWithNext root)
        {
            var queue = new Queue <NodeWithNext>();

            queue.Enqueue(root);
            while (queue.Count > 0)
            {
                var current = queue.Dequeue();
                var next    = current.Next != null?current.Next.Value.ToString() : "";

                Console.WriteLine($"[{current.Value} -> {next}]");
                if (current.Left != null)
                {
                    queue.Enqueue(current.Left);
                }
                if (current.Right != null)
                {
                    queue.Enqueue(current.Right);
                }
            }
        }