欢迎访问宙启技术站
智能推送

通过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

在本例中,我们创建了一个二叉树,插入了几个节点,并测试了搜索和删除的功能。