用Python实现二叉搜索树

2023-04-11 00:00:00 python

下面是使用Python实现二叉搜索树的详细代码演示:

class Node(object):
    def __init__(self, data):
        self.data = data
        self.left = None
        self.right = None

class BinarySearchTree(object):
    def __init__(self):
        self.root = None

    def insert(self, data):
        new_node = Node(data)
        if self.root is None:
            self.root = new_node
        else:
            curr_node = self.root
            while curr_node is not None:
                if data < curr_node.data:
                    if curr_node.left is None:
                        curr_node.left = new_node
                        break
                    else:
                        curr_node = curr_node.left
                else:
                    if curr_node.right is None:
                        curr_node.right = new_node
                        break
                    else:
                        curr_node = curr_node.right

    def search(self, data):
        curr_node = self.root
        while curr_node is not None:
            if curr_node.data == data:
                return True
            elif data < curr_node.data:
                curr_node = curr_node.left
            else:
                curr_node = curr_node.right
        return False

    def inorder_traversal(self, curr_node, traversal):
        if curr_node is not None:
            self.inorder_traversal(curr_node.left, traversal)
            traversal.append(curr_node.data)
            self.inorder_traversal(curr_node.right, traversal)
        return traversal

bst = BinarySearchTree()
bst.insert(50)
bst.insert(30)
bst.insert(20)
bst.insert(40)
bst.insert(70)
bst.insert(60)
bst.insert(80)

print(bst.search(20)) # True
print(bst.search(90)) # False

inorder_list = bst.inorder_traversal(bst.root, [])
print(inorder_list) # [20, 30, 40, 50, 60, 70, 80]

在以上代码中,定义了两个类:Node表示二叉搜索树的节点,BinarySearchTree表示二叉搜索树。

Node类包含了数据data、指向左子树的指针left和指向右子树的指针rightBinarySearchTree类包含了根节点root,并定义了插入节点、查找数据、中序遍历的方法。

插入节点的方法从根节点开始,如果根节点为空,就将新节点作为根节点;否则遍历二叉搜索树,找到合适的位置插入节点。

查找数据的方法同样遍历二叉搜索树,根据数据的大小判断是向左子树还是向右子树搜索,直到找到目标数据或遍历完整个树。

中序遍历的方法使用递归实现,先遍历左子树,再遍历节点本身,最后遍历右子树。中序遍历的结果是有序的,因此可以用于排序操作。

通过以上实现,我们可以创建二叉搜索树,插入新节点、查找数据和中序遍历。在实际应用中,二叉搜索树还可以用于解决一些其他问题,例如寻找能够排序的最大深度、判断两棵树是否相同等。

相关文章