通过Python函数实现二叉树查找
发布时间:2023-06-26 06:42:07
二叉树是数据结构中经典的数据结构之一,由于其较快的查找性能,被广泛应用于计算机科学和各种应用。在Python中,二叉树查找算法是非常常见的一种变体。
二叉树查找的基本思路是通过每个节点的关键字来对树进行搜索,以查找特定的节点或数据项并返回相应的结果。为了实现这个算法,需要应用一些基本的操作,例如插入节点,删除节点和搜索节点。
首先我们需要定义一个二叉树的节点类,这个类包含了一个节点关键字,以及左右子节点的引用。当一个节点没有子节点时,它们的值将为None。
class TreeNode:
def __init__(self, val):
self.val = val
self.left = None
self.right = None
接着我们需要构造一个二叉树的类,这个类将包含树的所有节点。我们定义一个变量root来表示树的根节点,以及用于插入节点,删除节点和搜索节点的方法。
class BinaryTree:
def __init__(self):
self.root = None
def insert(self, val):
pass
def delete(self, val):
pass
def search(self, val):
pass
在二叉树中,每个节点最多只有两个子节点。因此,我们需要确定新节点应该放在哪个位置。如果当前节点没有孩子,则新节点将成为其唯一孩子。如果当前节点有一个孩子,则新节点将成为第二个孩子。如果当前节点已有两个孩子,则需要递归遍历该节点的子树,直到找到一个空位置为止。插入节点的代码如下所示:
def insert(self, val):
if self.root is None:
self.root = TreeNode(val)
else:
self._insert(val, self.root)
def _insert(self, val, node):
if val < node.val:
if node.left is None:
node.left = TreeNode(val)
else:
self._insert(val, node.left)
elif val > node.val:
if node.right is None:
node.right = TreeNode(val)
else:
self._insert(val, node.right)
else:
raise ValueError("Value already exists in tree")
接下来就是搜索节点,这个操作需要遍历二叉树。搜索节点的代码如下所示:
def search(self, val):
if self.root is None:
return False
else:
return self._search(val, self.root)
def _search(self, val, node):
if node is None:
return False
elif node.val == val:
return True
elif val < node.val:
return self._search(val, node.left)
else:
return self._search(val, node.right)
删除节点相对来说比较复杂,可以根据树的性质来确定节点的位置。如果目标节点没有孩子,则直接删除它。如果目标节点只有一个孩子,则用该孩子替换目标节点。如果目标节点有两个孩子,则需要找到目标节点的右子树中最小的节点,用该节点替换目标节点,然后删除该节点。删除的代码如下所示:
def delete(self, val):
if self.root is None:
raise ValueError("Value not in tree")
else:
self._delete(val, self.root)
def _delete(self, val, node):
if node is None:
raise ValueError("Value not in tree")
elif val < node.val:
node.left = self._delete(val, node.left)
elif val > node.val:
node.right = self._delete(val, node.right)
else:
if node.left is None:
return node.right
elif node.right is None:
return node.left
else:
temp = self._find_min_node(node.right)
node.val = temp.val
node.right = self._delete(temp.val, node.right)
return node
def _find_min_node(self, node):
while node.left is not None:
node = node.left
return node
最后,我们可以用以下代码创建一个二叉树对象并执行测试:
# create binary tree binary_tree = BinaryTree() # insert nodes binary_tree.insert(7) binary_tree.insert(3) binary_tree.insert(10) binary_tree.insert(1) binary_tree.insert(5) binary_tree.insert(9) # search for value print(binary_tree.search(5)) # True print(binary_tree.search(11)) # False # delete value binary_tree.delete(5) print(binary_tree.search(5)) # False
在本例中,我们创建了一个二叉树,插入了几个节点,并测试了搜索和删除的功能。
