Python Data Structure 简明教程
Python - Binary Tree
树表示由边连接的节点。它是一种非线性数据结构。它具有以下属性:
-
一个节点被标记为根节点。
-
根节点以外的每个节点与一个父节点相关联。
-
每个节点可以拥有任意数量的子节点。
我们通过使用前面讨论过的节点概念在 Python 中创建一个树数据结构。我们将一个节点指定为根节点,然后添加更多节点作为子节点。以下是创建根节点的程序。
Create Root
我们只创建一个 Node 类,并将一个值分配给节点。这将成为仅有一个根节点的树。
Inserting into a Tree
为了插入树中,我们使用上面创建的相同 Node 类,并向其添加一个插入类。插入类将节点的值与父节点的值进行比较,并决定将其添加为左节点还是右节点。最后,使用 PrintTree 类来打印树。
Example
class Node:
def __init__(self, data):
self.left = None
self.right = None
self.data = data
def insert(self, data):
# Compare the new value with the parent node
if self.data:
if data < self.data:
if self.left is None:
self.left = Node(data)
else:
self.left.insert(data)
elif data > self.data:
if self.right is None:
self.right = Node(data)
else:
self.right.insert(data)
else:
self.data = data
# Print the tree
def PrintTree(self):
if self.left:
self.left.PrintTree()
print( self.data),
if self.right:
self.right.PrintTree()
# Use the insert method to add nodes
root = Node(12)
root.insert(6)
root.insert(14)
root.insert(3)
root.PrintTree()
Traversing a Tree
可以通过决定一个顺序来访问每个节点来遍历树。我们可以清楚地看到,我们可以从一个节点开始,然后先访问左子树,再访问右子树。或者,我们也可以先访问右子树,再访问左子树。因此,这些树遍历方法有不同的名称。
Tree Traversal Algorithms
遍历是一个访问树的所有节点并可能也打印其值的过程。因为所有节点都通过边(链接)连接,所以我们总是从根(头)节点开始。也就是说,我们不能在树中随机访问一个节点。我们可以使用三种方式来遍历树。
-
In-order Traversal
-
Pre-order Traversal
-
Post-order Traversal
In-order Traversal
在这种遍历方法中,首先访问左子树,然后访问根,最后访问右子树。我们应该始终记住,每个节点本身都可能表示一个子树。
在下面的 Python 程序中,我们使用 Node 类来创建根节点以及左节点和右节点的占位符。然后,我们创建一个插入函数以将数据添加到树中。最后,通过创建空列表并首先添加左节点,然后添加根节点或父节点来实现中序遍历逻辑。
最后,添加左节点以完成中序遍历。请注意,该过程将对每个子树重复,直到遍历所有节点。
Example
class Node:
def __init__(self, data):
self.left = None
self.right = None
self.data = data
# Insert Node
def insert(self, data):
if self.data:
if data < self.data:
if self.left is None:
self.left = Node(data)
else:
self.left.insert(data)
else data > self.data:
if self.right is None:
self.right = Node(data)
else:
self.right.insert(data)
else:
self.data = data
# Print the Tree
def PrintTree(self):
if self.left:
self.left.PrintTree()
print( self.data),
if self.right:
self.right.PrintTree()
# Inorder traversal
# Left -> Root -> Right
def inorderTraversal(self, root):
res = []
if root:
res = self.inorderTraversal(root.left)
res.append(root.data)
res = res + self.inorderTraversal(root.right)
return res
root = Node(27)
root.insert(14)
root.insert(35)
root.insert(10)
root.insert(19)
root.insert(31)
root.insert(42)
print(root.inorderTraversal(root))
Pre-order Traversal
在这种遍历方法中,首先访问根节点,然后访问左子树,最后访问右子树。
在下面的 Python 程序中,我们使用 Node 类来创建根节点以及左节点和右节点的占位符。然后,我们创建一个插入函数来向树中添加数据。最后,通过创建一个空列表并首先添加根节点,然后添加左节点,实现了先序遍历逻辑。
最后,添加右节点以完成先序遍历。请注意,此过程会重复执行,直到遍历完所有节点为止。
Example
class Node:
def __init__(self, data):
self.left = None
self.right = None
self.data = data
# Insert Node
def insert(self, data):
if self.data:
if data < self.data:
if self.left is None:
self.left = Node(data)
else:
self.left.insert(data)
elif data > self.data:
if self.right is None:
self.right = Node(data)
else:
self.right.insert(data)
else:
self.data = data
# Print the Tree
def PrintTree(self):
if self.left:
self.left.PrintTree()
print( self.data),
if self.right:
self.right.PrintTree()
# Preorder traversal
# Root -> Left ->Right
def PreorderTraversal(self, root):
res = []
if root:
res.append(root.data)
res = res + self.PreorderTraversal(root.left)
res = res + self.PreorderTraversal(root.right)
return res
root = Node(27)
root.insert(14)
root.insert(35)
root.insert(10)
root.insert(19)
root.insert(31)
root.insert(42)
print(root.PreorderTraversal(root))
Post-order Traversal
在此遍历方法中,根节点最后访问,因此得名。首先,我们遍历左子树,然后遍历右子树,最后遍历根节点。
在下面的 Python 程序中,我们使用 Node 类来创建根节点以及左节点和右节点的占位符。然后,我们创建一个插入函数来向树中添加数据。最后,通过创建一个空列表并先添加左节点,然后添加右节点,实现了后序遍历逻辑。
最后,添加根节点或父节点以完成后序遍历。请注意,此过程会重复执行,直到遍历完所有节点为止。
Example
class Node:
def __init__(self, data):
self.left = None
self.right = None
self.data = data
# Insert Node
def insert(self, data):
if self.data:
if data < self.data:
if self.left is None:
self.left = Node(data)
else:
self.left.insert(data)
else if data > self.data:
if self.right is None:
self.right = Node(data)
else:
self.right.insert(data)
else:
self.data = data
# Print the Tree
def PrintTree(self):
if self.left:
self.left.PrintTree()
print( self.data),
if self.right:
self.right.PrintTree()
# Postorder traversal
# Left ->Right -> Root
def PostorderTraversal(self, root):
res = []
if root:
res = self.PostorderTraversal(root.left)
res = res + self.PostorderTraversal(root.right)
res.append(root.data)
return res
root = Node(27)
root.insert(14)
root.insert(35)
root.insert(10)
root.insert(19)
root.insert(31)
root.insert(42)
print(root.PostorderTraversal(root))