实现深度优先遍历
假如让你说出123三个数字的全排列你可以很快说出来123,132,213,231,312,321,但是让你说出1~50总共20个数字的全排列是不是就没那么简单了呢?此时需要进行代码实现。
浅析深度优先遍历与广度优先遍历区别
深度优先遍历的非递归做法时采用栈;广度优先遍历的非递归做法时采用队列。
深度优先遍历是把每个分支深入到不能深入为止。具体的有先序遍历、中序遍历、后序遍历;广度优先遍历又称层序遍历,从上往下一层一层遍历。
其实区别很简单,使用时由于深度和广度的性质不同,对于栈和队列的使用就随之匹配。
栈与队列区别
栈
栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。栈具有记忆作用,对栈的插入与删除操作中,不需要改变栈底指针。
栈是允许在同一端进行插入和删除操作的特殊线性表。允许进行插入和删除操作的一端称为栈顶(top),另一端为栈底(bottom);栈底固定,而栈顶浮动;栈中元素个数为零时称为空栈。插入一般称为进栈(PUSH),删除则称为退栈(POP)。栈也称为后进先出表。
队列
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。
在队列这种数据结构中,最先插入的元素将是最先被删除的元素;反之最后插入的元素将是最后被删除的元素,因此队列又称为"先进先出"(FIFO—first in first out)的线性表。
深度优先遍历代码
using System;
namespace StudyOfDFSPractice
{
class Program
{
static int n = 0;
static int[] a;
static int[] book;
static int allsum = 0;
static void Main(string[] args)
{
Console.WriteLine(“请输入数字N:”);
n = int.Parse(Console.ReadLine());
Console.WriteLine(“数字1~” + n + “的全排列为:”);
a = new int[n + 1];
book = new int[n + 1];
dfs(1);
Console.WriteLine(“一共有”+allsum+“种排列方法”);
Console.ReadLine();
}
public static void dfs(int step)
{
if (step == n + 1)
{
//输出一种结果
for (int i = 1; i < a.Length; i++)
{
Console.Write(a[i]);
allsum ++;
}
Console.WriteLine();
return; //返回到最近一次调用dfs函数的地方
}
for (int i = 1; i <= n; i++)
{
if (book[i] == 0)
{
a[step] = i;
book[i] = 1;
dfs(step + 1);
book[i] = 0;
}
}
}
}
}