📅  最后修改于: 2023-12-03 14:46:39.381000             🧑  作者: Mango
二叉树是一种常用的数据结构,它由根节点、左子树和右子树组成,每个节点最多拥有两个子节点。在Python中,我们可以使用类来实现二叉树。
定义一个二叉树节点 Node 类:
class Node:
def __init__(self, data):
self.left = None
self.right = None
self.data = data
接下来,我们可以创建 BinarySearchTree 类来创建二叉树。
class BinarySearchTree:
def __init__(self):
self.root = None
def insert(self, data):
if self.root is None:
self.root = Node(data)
else:
self._insert(data, self.root)
def _insert(self, data, current_node):
if data < current_node.data:
if current_node.left is None:
current_node.left = Node(data)
else:
self._insert(data, current_node.left)
elif data > current_node.data:
if current_node.right is None:
current_node.right = Node(data)
else:
self._insert(data, current_node.right)
else:
print("Value is already in tree.")
def __contains__(self, data):
if self.root:
return self._contains(data, self.root)
else:
return False
def _contains(self, data, current_node):
if current_node is None:
return False
elif current_node.data == data:
return True
elif data < current_node.data:
return self._contains(data, current_node.left)
else:
return self._contains(data, current_node.right)
遍历二叉树是指按照一定的顺序访问树中的每个节点。常见的遍历方式有前序遍历、中序遍历和后序遍历。
依然在 BinarySearchTree 类中,我们可以增加三个方法,用于实现不同的遍历方式。
前序遍历的顺序是:根节点 -> 左子树 -> 右子树。代码实现:
def pre_order(self):
if self.root is not None:
self._pre_order(self.root)
def _pre_order(self, current_node):
if current_node is not None:
print(current_node.data)
self._pre_order(current_node.left)
self._pre_order(current_node.right)
中序遍历的顺序是:左子树 -> 根节点 -> 右子树。代码实现:
def in_order(self):
if self.root is not None:
self._in_order(self.root)
def _in_order(self, current_node):
if current_node is not None:
self._in_order(current_node.left)
print(current_node.data)
self._in_order(current_node.right)
后序遍历的顺序是:左子树 -> 右子树 -> 根节点。代码实现:
def post_order(self):
if self.root is not None:
self._post_order(self.root)
def _post_order(self, current_node):
if current_node is not None:
self._post_order(current_node.left)
self._post_order(current_node.right)
print(current_node.data)
除了基础功能,我们还可以在 BinarySearchTree 类中添加其他方法,如查找最小值、最大值、删除节点等。二叉树的各种操作能够极大地帮助我们解决实际问题,是编程中值得深入了解的一个重要数据结构。