Python数据结构 二进制树
树表示由边连接的节点。它是一个非线性的数据结构。它有以下属性 –
- 一个结点被标记为根结点。
-
除根节点外的每个节点都与一个父节点相关。
-
每个节点可以有一个任意数量的chid节点。
我们通过使用前面讨论的os节点的概念在python中创建一个树形数据结构。我们指定一个节点作为根节点,然后添加更多的节点作为子节点。下面是创建根节点的程序。
创建根节点
我们只需创建一个Node类,并为该节点分配一个值。这就变成了只有一个根节点的树。
例子
class Node:
def __init__(self, data):
self.left = None
self.right = None
self.data = data
def PrintTree(self):
print(self.data)
root = Node(10)
root.PrintTree()
输出
当上述代码被执行时,它产生了以下结果 –
10
插入树中
为了插入到树中,我们使用上面创建的相同的节点类,并给它添加一个插入类。insert类将节点的值与父节点进行比较,决定将其作为左节点或右节点加入。最后使用PrintTree类来打印树。
例子
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()
输出
当上述代码被执行时,它产生了以下结果 –
3 6 12 14
遍历一棵树
通过决定访问每个节点的顺序,可以对树进行遍历。我们可以清楚地看到,我们可以从一个节点开始,然后先访问左边的子树,接下来访问右边的子树。或者我们也可以先访问右边的子树,再访问左边的子树。因此,这些树的遍历方法有不同的名称。
树的遍历算法
遍历是一个访问树的所有节点的过程,也可以打印它们的值。因为,所有的节点都是通过边(链接)连接的,我们总是从根(头)节点开始。也就是说,我们不能随机地访问树中的一个节点。我们有三种方法来遍历一棵树。
- 顺序内遍历
-
前序遍历
-
顺序后遍历
顺序内遍历
在这种遍历方法中,首先访问的是左边的子树,然后是根,最后是右边的子树。我们应该永远记住,每个节点都可能代表一个子树本身。
在下面的python程序中,我们使用Node类来创建根节点以及左、右节点的放置器。然后,我们创建了一个插入函数来向树中添加数据。最后,通过创建一个空列表并首先添加左节点,然后是根节点或父节点,实现了顺序遍历逻辑。
最后再添加左边的节点,以完成In-order遍历。请注意,这个过程对每个子树都要重复,直到所有的节点都被遍历。
例子
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))
输出
当上述代码被执行时,它产生了以下结果 –
[10, 14, 19, 27, 31, 35, 42]
前序遍历法
在这个遍历方法中,首先访问根节点,然后是左子树,最后是右子树。
在下面的python程序中,我们使用Node类来创建根节点以及左、右节点的放置器。然后,我们创建了一个插入函数来向树中添加数据。最后,通过创建一个空列表并首先添加根节点,然后添加左节点来实现预排序遍历逻辑。
最后,添加右边的节点来完成Pre-order遍历。请注意,这个过程对每个子树都是重复的,直到所有的节点被遍历。
例子
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))
输出
当上述代码被执行时,它产生了以下结果 –
[27, 14, 10, 19, 35, 31, 42]
后序遍历
在这种遍历方法中,根节点被最后访问,因此得名。首先,我们遍历左边的子树,然后是右边的子树,最后是根节点。
在下面的python程序中,我们使用Node类来创建根节点以及左、右节点的存放位置。然后,我们创建了一个插入函数来向树中添加数据。最后,通过创建一个空列表并首先添加左节点,然后添加右节点来实现后序遍历逻辑。
最后,根节点或父节点被添加,完成后序遍历。请注意,这个过程对每个子树都是重复的,直到所有的节点被遍历。
例子
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))
输出
当上述代码被执行时,它产生了以下结果 –
[10, 19, 14, 31, 42, 35, 27]