众所周知,广度优先搜索和深度优先搜索是十分常用的算法,它们被应用于图论中,可以用来查找图中的一个元素,而本篇文章将介绍如何用python实现这些功能。
建立树:
1、顺序存储:
顺序存储是一种工具简单,消耗脑力的一种方法,这种方法可以直接使用列表进行存储,但要进行各类操作的话十分麻烦,容易被绕晕。
2、字典存储:
这种方法在C里面就是结构体,而换成python就是使用字典,为了实现一对多,我们可以设字典的值为一个字典,然后字典套字典,这样就能快速理清思路了。
tree={1:{2:{4:{},5:{}},3:{6:{},7:{}}}
建立图:
1、二维数组存储:
这种方法十分费空间,因为会产生大量的无图区,所以非常不建议使用。
2、连接存储:
这种方法是大概是这样:
设第一维为连接主
而第二维为连接者
这样就可以使空量为0
picture=[]
for i in range(100):
picture[i]=[]
for k in range(100):
picture[i][k]=i
当然,这只是最初步的,我们重点是要做出算法来。就先从深度优先搜索开始吧。深度优先搜索是采用递归算法实现的,因为深搜需要借助栈来辅助,而是用递归就可以直接使用系统栈。而我们则查找最好的满二叉树。创建方法在上面已经写过了,就不多写了。接着就要理清思路:
定义函数 深度优先搜索(查找值,当前值,二叉树深度,当前深度):
如果 当前值==查找值:
返回 真
否则如果 当前深度==二叉树深度:
返回 假
否则:
如果 深度优先搜索(查找值,树的(当前值的下标*2)项,二叉树深度,当前深度+1)==真 或者 深度优先搜索(查找值,树的(当前值的下标*2+1)项,二叉树深度,当前深度+1):
返回 真
否则:
返回 假
理清了思路,就好写代码了:
t=[]
for i in range(63):
t.append(i)
def dfs(k,d,t,dt):
if k==d:
return True
else if t==dt:
return False
else:
if dfs(k,t[t.index(d)*2],t,dt+1)==True or dfs(k,t[t.index(d)*2+1],t,dt+1)==True:
return True
else:
return False
dfs(9,0,1,6)
深度优先搜索算法搞定了,就该讲广度优先算法,也叫宽度优先算法。这种算法就跟铺地锦一样,它是从远到近蔓延过去的。编程的话就可以先建一个循环,这个循环就作为树的层次,而在这个循环中还要套一个循环,这个循环用于查找这一层内的所有子树的信息:
t=[]
for i in range(63):
t.append(i)
i=0
k=0
while i<6:
for i in range(k,k+2^i):
if t[i]==5:
print(i)
k+=2^i
i+=1
好了关于树的算法就到这里了,由此可见,算法并不限于编程语言,只要思想在,任何编程语言都是可以实现的。