图的深度优先遍历

'''
    深度优先遍历
    首先遍历结果显然不唯一
'''
class Node():
    def __init__(self,value):
        self.value=value  #对应数据
        self.enter=0     #该节点的入度
        self.out=0       #该节点的出度
        self.nexts=[]    #由该点发散出去的边(出去的边),直接相连的点
        self.edges=[]    #由该点发散出去的边

        '''
            这个设计囊括了图的大部分内容
        '''

class Edge():
    def __init__(self,weight,From,To):
        '''
        :param weight: 该边所具有的权重
        :param From: 从那个点出发
        :param To: 到达那条边
        '''
        self.weight=weight
        self.From=From
        self.To=To

class Graph():
    def __init__(self):
        self.nodes={}         #创建一个空字典里面key:int  value:Node
        self.edges=set()      #创建一个集合里面存放每一条边,同时每条边还有对应的属性
def dfs(node):
    '''
        基本思路:
            1.入栈
            2.创建集合set,防止重复走路,导致死循环和多余输出

            3.开始大的循环,只要栈不为空就可以继续
            4.开始小的循环,在node.nexts属性中找到想要的
                注意这里要把cur和next都重新入栈(先入cur再入next)
                并向set中添加next,以及打印next
    :param node:
    :return:
    '''
    if node==None:
        return
    stack=[node]
    set={node}
    print(node.val) #先直接打印了
    while stack:#不为空进入循环
        cur=stack.pop()
        for item in cur.nexts:
            if item not in set:#说明没有出现过
                stack.append(cur)
                stack.append(item)
                '''
                    这是在干什么,首先添加cur是因为后面会强制结束循环,可能有相连元素没有遍历到,所以重新添加进去
                    在添加item是为了什么,是为了深度优先,继续往下面走着
                '''
                set.add(item)
                print(item.val)

                break

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值