很多问答搜出来的答案都是,广度优先遍历不论是否存在回路都会重复,而深度优先遍历只有存在回路才会重复。那么,这个所谓的存在重复,是怎么去看呢,如果单纯的写出遍历序列,好像并不那么清晰能明白为什么二者一个可以一个不可以。
实际上,此时要考虑广度优先遍历和深度优先遍历二者的结构。
广度优先遍历借助队列结构,读取节点是通过出队,而后又将已读取的节点后继进行入队。也就是说,在广度优先遍历操作的过程中,由于出入队操作,队中留存的节点元素并不能够充分说明是否存在回路。
深度优先遍历借助栈结构,将可执行的节点元素逐个入栈,直到本条路径再也找不到可执行的节点。这时将栈中留存内容出栈,由此回溯,对下一条路径进行入栈操作。此时,若栈中元素出现重复,则可表明存在回路。
若仍不够清楚,读者可根据栈与队列的特点,找一个图,根据广度优先遍历和深度优先遍历的情况自行进行一下出入队,出入栈操作。