private void Postorder(DSTreeNode <T> node)
        {
            if (node.Left != null)
            {
                Postorder(node.Left);
            }

            if (node.Right != null)
            {
                Postorder(node.Right);
            }

            _TempDataConsole.Add(node.Data);
        }
        private void traverseLevel(DSTreeNode <T> node, int level)
        {
            if (node != null)
            {
                if (level == 1)
                {
                    this._TempDataConsole.Add(node.Data);
                    return;
                }

                this.traverseLevel(node.Left, level - 1);
                this.traverseLevel(node.Right, level - 1);
            }
        }
        public void Add(T value)
        {
            /// check if we have root?
            /// if not then add new root element and then return.
            /// If yes then traverse its children from left to right. find first free spot and add the node in that spot.

            DSTreeNode <T> newNode = new DSTreeNode <T>(value);

            if (this.Head == null)
            {
                this.Head = newNode;
                return;
            }

            DSQueue <DSTreeNode <T> > dSQueue = new DSQueue <DSTreeNode <T> >();

            dSQueue.Enqueue(this.Head);

            while (dSQueue.Count > 0)
            {
                var current = dSQueue.Dequeue();

                if (current.Data.Left == null)
                {
                    current.Data.Left = newNode;
                    break;
                }
                else
                {
                    dSQueue.Enqueue(current.Data.Left);
                }

                if (current.Data.Right == null)
                {
                    current.Data.Right = newNode;
                    break;
                }
                else
                {
                    dSQueue.Enqueue(current.Data.Right);
                }
            }
        }
        private int findHeightOfTree(DSTreeNode <T> node)
        {
            if (node == null)
            {
                return(0);
            }

            int hLeft  = findHeightOfTree(node.Left);
            int hRight = findHeightOfTree(node.Right);

            if (hRight > hLeft)
            {
                return(hRight + 1);
            }
            else
            {
                return(hLeft + 1);
            }
        }
        private void traverseUsingQueue(DSTreeNode <T> node, DSQueue <DSTreeNode <T> > queue, List <T> newList)
        {
            while (queue.Count != 0)
            {
                var current = queue.Dequeue();

                newList.Add(current.Data.Data);

                if (current.Data.Left != null)
                {
                    queue.Enqueue(current.Data.Left);
                }

                if (current.Data.Right != null)
                {
                    queue.Enqueue(current.Data.Right);
                }
            }
        }