public static bool FindRoute(this DSGraph graph, string nodeA, string nodeB)
        {
            DSQueue <string>          queue   = new DSQueue <string>();
            Dictionary <string, bool> visible = new Dictionary <string, bool>();

            queue.Enqueue(nodeA);

            while (!queue.IsEmpty())
            {
                var current = queue.Dequeue().Data;
                if (!visible.ContainsKey(current))
                {
                    visible.Add(current, true);

                    if (current == nodeB)
                    {
                        return(true);
                    }
                }

                foreach (var item in graph._node[current])
                {
                    if (!visible.ContainsKey(item))
                    {
                        queue.Enqueue(item);
                    }
                }
            }

            return(visible.ContainsKey(nodeB));
        }
示例#2
0
        public List <string> BFS(string node)
        {
            DSQueue <string> dSQueue = new DSQueue <string>();

            Dictionary <string, bool> visited = new Dictionary <string, bool>();

            dSQueue.Enqueue(node);

            while (!dSQueue.IsEmpty())
            {
                string current = dSQueue.Dequeue().Data;

                if (!visited.ContainsKey(current))
                {
                    visited.Add(current, true);
                }

                foreach (var item in _node[current])
                {
                    if (!visited.ContainsKey(item))
                    {
                        dSQueue.Enqueue(item);
                    }
                }
            }

            return(visited.Select(s => s.Key).ToList());
        }
        public List <T> LevelOrderTraversalUsingQueue()
        {
            var newList = new List <T>();

            if (this.Head != null)
            {
                DSQueue <DSTreeNode <T> > queue = new DSQueue <DSTreeNode <T> >();

                queue.Enqueue(this.Head);

                this.traverseUsingQueue(this.Head, queue, newList);
            }

            return(newList);
        }
示例#4
0
        public DSTreeNode <int> Construct()
        {
            if (_listHead == null)
            {
                return(null);
            }

            DSQueue <DSTreeNode <int> > queue = new DSQueue <DSTreeNode <int> >();

            DSTreeNode <int> treeNode = new DSTreeNode <int>(_listHead.Data);

            queue.Enqueue(treeNode);

            var current = _listHead;

            while (current != null)
            {
                DSTreeNode <int> de = null;
                if (queue.Count > 0)
                {
                    de = queue.Dequeue();
                }

                if (current.Next != null)
                {
                    de.Left = new DSTreeNode <int>(current.Next.Data);
                    queue.Enqueue(de.Left);
                    current = current.Next;

                    if (current.Next != null)
                    {
                        de.Right = new DSTreeNode <int>(current.Next.Data);
                        queue.Enqueue(de.Right);
                        current = current.Next;
                    }
                }
                else
                {
                    break;
                }
            }

            return(treeNode);
        }
        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 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);
                }
            }
        }
示例#7
0
        public int[] LevelOrderTraversal()
        {
            DSTreeNode <int> _treeHead = Construct();

            List <int> arr = new List <int>();

            DSQueue <DSTreeNode <int> > queue = new DSQueue <DSTreeNode <int> >();

            var tempNode = _treeHead;

            while (tempNode != null)
            {
                arr.Add(tempNode.Data);

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

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

                if (queue.Count > 0)
                {
                    tempNode = queue.Dequeue();
                }
                else
                {
                    tempNode = null;
                }
            }

            return(arr.ToArray());
        }