我是靠谱客的博主 漂亮大象,这篇文章主要介绍7.2 二叉树的遍历(python数据结构与算法),现在分享给大家,希望可以做个参考。

  • 树的遍历是树的一种重要的运算。所谓遍历是指对树中所有结点的信息的访问,即依次对树中每个结点访问一次且仅访问一次,我们把这种对所有节点的访问称为遍历(traversal)。那么树的两种重要的遍历模式是深度优先遍历和广度优先遍历,深度优先一般用递归,广度优先一般用队列。一般情况下能用递归实现的算法大部分也能用堆栈来实现。

广度优先遍历(层次遍历)

  • 从树的根节点开始,从上到下从从左到右遍历整个树的节点

    python实现

    复制代码
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    def breath_traval(self): """使用广度优先,进行遍历""" queue = [] queue.append(self.root_node) while queue: cur_node = queue.pop(0) print(cur_node.elem, end=" ") if cur_node.lchild is not None: queue.append(cur_node.lchild) if cur_node.rchild is not None: queue.append(cur_node.rchild)

深度优先遍历

对于一颗二叉树,深度优先搜索(Depth First Search)是沿着树的深度遍历树的节点,尽可能深的搜索树的分支。
那么深度遍历有重要的三种方法。这三种方式常被用于访问树的节点,它们之间的不同在于访问每个节点的次序不同。这三种遍历分别叫做 先序遍历(preorder)中序遍历(inorder)后序遍历(postorder)。我们来给出它们的详细定义,然后举例看看它们的应用。

  1. 先序遍历 :在先序遍历中,我们先访问根节点,然后递归使用先序遍历访问左子树,再递归使用先序遍历访问右子树
    根节点->左子树->右子树

    python实现

    复制代码
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    def preorder(self, root_node): """先序遍历(根节点——>左节点——>右节点""" if root_node == None: return # 根节点 print(root_node.elem, end=" ") # 左节点 self.preorder(root_node.lchild) # 右节点 self.preorder(root_node.rchild)
  2. 中序遍历 :在中序遍历中,我们递归使用中序遍历访问左子树,然后访问根节点,最后再递归使用中序遍历访问右子树
    左子树->根节点->右子树

    python实现

    复制代码
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    def inorder(self, root_node): """中序遍历(左节点——>根节点——>右节点)""" if root_node == None: return # 左节点 self.inorder(root_node.lchild) # 根节点 print(root_node.elem, end=" ") # 右节点 self.inorder(root_node.rchild)
  3. 后序遍历 :在后序遍历中,我们先递归使用后序遍历访问左子树和右子树,最后访问根节点
    左子树->右子树->根节点

    python实现

    复制代码
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    def postorder(self, root_node): """后序遍历(左节点——>右节点——>根节点)""" if root_node == None: return # 左节点 self.postorder(root_node.lchild) # 右节点 self.postorder(root_node.rchild) # 根节点 print(root_node.elem, end=" ")

python实现下图所示效果

在这里插入图片描述

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
class Node(object): """节点类""" def __init__(self, item): self.elem = item self.lchild = None self.rchild = None class Tree(object): """树类(初始化空树)""" def __init__(self): self.root_node = None def add(self, item): """将节点添加到树中""" node = Node(item) # 一开始是树中没有节点的情况 if self.root_node == None: self.root_node = node return queue = [] # 模拟队列的结构 queue.append(self.root_node) while queue: cur_node = queue.pop(0) # 左子节点 if cur_node.lchild is None: cur_node.lchild = node return else: queue.append(cur_node.lchild) # 右子节点 if cur_node.rchild is None: cur_node.rchild = node return else: queue.append(cur_node.rchild) def breath_traval(self): """使用广度优先,进行遍历""" queue = [] queue.append(self.root_node) while queue: cur_node = queue.pop(0) print(cur_node.elem, end=" ") if cur_node.lchild is not None: queue.append(cur_node.lchild) if cur_node.rchild is not None: queue.append(cur_node.rchild) def preorder(self, root_node): """先序遍历(根节点——>左节点——>右节点)""" if root_node == None: return # 根节点 print(root_node.elem, end=" ") # 左节点 self.preorder(root_node.lchild) # 右节点 self.preorder(root_node.rchild) def inorder(self, root_node): """中序遍历(左节点——>根节点——>右节点)""" if root_node == None: return # 左节点 self.inorder(root_node.lchild) # 根节点 print(root_node.elem, end=" ") # 右节点 self.inorder(root_node.rchild) def postorder(self, root_node): """后序遍历(左节点——>右节点——>根节点)""" if root_node == None: return # 左节点 self.postorder(root_node.lchild) # 右节点 self.postorder(root_node.rchild) # 根节点 print(root_node.elem, end=" ") if __name__ == "__main__": tree = Tree() tree.add(0) tree.add(1) tree.add(2) tree.add(3) tree.add(4) tree.add(5) tree.add(6) tree.add(7) tree.add(8) tree.add(9) tree.breath_traval() print("n") tree.preorder(tree.root_node) print("n") tree.inorder(tree.root_node) print("n") tree.postorder(tree.root_node)

最后

以上就是漂亮大象最近收集整理的关于7.2 二叉树的遍历(python数据结构与算法)的全部内容,更多相关7.2内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(42)

评论列表共有 0 条评论

立即
投稿
返回
顶部