python双向图遍历_基于图的从头输出的深度优先遍历python

class DFS:

def __init__(self, start):

self.path = [start]

self.path_list = []

def func(self, graph, node):

if node not in graph.keys():

print(self.path)

path = copy.deepcopy(self.path)

self.path_list.append(path)

else:

for item in graph[node]:

self.path.append(item)

self.func(graph, item)

self.path.pop() # 弹出最后一个元素

if __name__ == '__main__':

reaction_graph = {1: [2, 3], 2: [3, 4, 5], 3: [6, 7], 4: [8]}

dfs = DFS(1)

dfs.func(reaction_graph, 1)

print(dfs.path_list)

[1, 2, 3, 6]

[1, 2, 3, 7]

[1, 2, 4, 8]

[1, 2, 5]

[1, 3, 6]

[1, 3, 7]

[[1, 2, 3, 6], [1, 2, 3, 7], [1, 2, 4, 8], [1, 2, 5], [1, 3, 6], [1, 3, 7]]

34b507d6387c9ea0c0b515c358a80ab4.png

de638df49f1d5a3342eecff86bcb011e.png

SLSLVLG

发布了42 篇原创文章 · 获赞 0 · 访问量 7136

私信

关注

标签:__,node,遍历,python,graph,self,dfs,path,从头

来源: https://blog.csdn.net/weixin_43236007/article/details/104411384

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我来给您讲解一下。 首先,我们需要定义一个二叉树节点类,包括节点值、左右子节点和指向父节点的指针。 ```python class TreeNode: def __init__(self, val): self.val = val self.left = None self.right = None self.parent = None ``` 接下来,我们可以先构建一棵二叉搜索树,并对其进行中序遍历,将遍历结果存储在一个列表中。 ```python def inorder_traversal(root, res): if not root: return inorder_traversal(root.left, res) res.append(root.val) inorder_traversal(root.right, res) root = TreeNode(4) root.left = TreeNode(2) root.left.left = TreeNode(1) root.left.right = TreeNode(3) root.right = TreeNode(5) res = [] inorder_traversal(root, res) print(res) # [1, 2, 3, 4, 5] ``` 接下来,我们需要将这棵二叉搜索树转化为循环的双链表。具体做法是,对于每个节点,将其左子节点的最右侧节点指向节点本身,将其右子节点的最左侧节点指向节点本身。 ```python def convert_to_doubly_linked_list(root): if not root: return None convert_to_doubly_linked_list(root.left) if root.left: left_rightmost = root.left while left_rightmost.right: left_rightmost = left_rightmost.right left_rightmost.right = root root.left = left_rightmost if root.right: right_leftmost = root.right while right_leftmost.left: right_leftmost = right_leftmost.left right_leftmost.left = root root.right = right_leftmost convert_to_doubly_linked_list(root.right) return root head = convert_to_doubly_linked_list(root) while head.left: head = head.left while head: print(head.val) head = head.right ``` 最后,我们需要按照正反序输出双链表中的所有元素。具体做法是,分别从头和尾开始遍历双链表,输出节点值。 ```python def print_doubly_linked_list(head): while head: print(head.val) head = head.right print_doubly_linked_list(root) # 正序 while root.right: root = root.right print_doubly_linked_list(root) # 反序 ``` 完整代码如下: ```python class TreeNode: def __init__(self, val): self.val = val self.left = None self.right = None self.parent = None def inorder_traversal(root, res): if not root: return inorder_traversal(root.left, res) res.append(root.val) inorder_traversal(root.right, res) root = TreeNode(4) root.left = TreeNode(2) root.left.left = TreeNode(1) root.left.right = TreeNode(3) root.right = TreeNode(5) res = [] inorder_traversal(root, res) print(res) # [1, 2, 3, 4, 5] def convert_to_doubly_linked_list(root): if not root: return None convert_to_doubly_linked_list(root.left) if root.left: left_rightmost = root.left while left_rightmost.right: left_rightmost = left_rightmost.right left_rightmost.right = root root.left = left_rightmost if root.right: right_leftmost = root.right while right_leftmost.left: right_leftmost = right_leftmost.left right_leftmost.left = root root.right = right_leftmost convert_to_doubly_linked_list(root.right) return root head = convert_to_doubly_linked_list(root) while head.left: head = head.left while head: print(head.val) head = head.right def print_doubly_linked_list(head): while head: print(head.val) head = head.right print_doubly_linked_list(root) # 正序 while root.right: root = root.right print_doubly_linked_list(root) # 反序 ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值