在Python中查找给定二叉树中是否存在BST的程序

在Python中查找给定二叉树中是否存在BST的程序

二叉树是一种经常使用的数据结构,它可以使用Python很容易地实现。在二叉树中,每个节点最多有两个子节点:左节点和右节点。其中,BST(二叉搜索树)是一种特殊的二叉树,具有以下特点:

  • 左子树的所有节点值都小于当前节点值。
  • 右子树的所有节点值都大于当前节点值。
  • 左右子树都是BST。

现在,我们需要写一个程序,在给定的二叉树中查找是否存在BST。

二叉树的实现和遍历

在Python中,我们可以使用类来实现二叉树。每个节点包含三个属性:value、left和right。其中,value存储当前节点的值,left和right分别存储左子树和右子树。

下面是一个简单的例子:

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

class BinaryTree:
    def __init__(self, root=None):
        self.root = root

接下来,我们可以实现二叉树的遍历,包括前序遍历、中序遍历和后序遍历。

class BinaryTree:
    # 创建二叉树

    # 前序遍历
    def preorder(self, node):
        if node is not None:
            print(node.value)
            self.preorder(node.left)
            self.preorder(node.right)

    # 中序遍历
    def inorder(self, node):
        if node is not None:
            self.inorder(node.left)
            print(node.value)
            self.inorder(node.right)

    # 后序遍历
    def postorder(self, node):
        if node is not None:
            self.postorder(node.left)
            self.postorder(node.right)
            print(node.value)

查找BST的实现

现在,让我们来看看如何查找给定二叉树中是否存在BST。回顾一下,BST需要满足左子树小于当前节点,右子树大于当前节点。因此,我们可以通过比较当前节点和它的左右子节点来判断它是否是一个BST。

下面是一个简单的程序,用于查找给定二叉树中是否存在BST:

class Solution:
    def isValidBST(self, root):
        """
        :type root: TreeNode
        :rtype: bool
        """
        def checkBST(node, left, right):
            if not node:
                return True
            if not left < node.value < right:
                return False
            return checkBST(node.left, left, node.value) and checkBST(node.right, node.value, right)

        return checkBST(root, float('-inf'), float('inf'))

在这个程序中,我们定义了一个名为checkBST的嵌套函数,该函数接受一个节点、一个左边界和一个右边界。如果当前节点为空,我们返回True。否则,如果当前节点不在左右边界之间,我们返回False。最后,我们递归检查当前节点的左子树和右子树,将左子树的右边界设置为当前节点的值,将右子树的左边界设置为当前节点的值。如果两个递归调用都返回True,则返回True。

完整代码

下面是完整的代码,用于查找给定二叉树中是否存在BST:

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

class BinaryTree:
    def __init__(self, root=None):
        self.root = root

    # 前序遍历
    def preorder(self, node):
        if node is not None:
            print(node.value)
            self.preorder(node.left)
            self.preorder(node.right)

    # 中序遍历
   def inorder(self, node):
        if node is not None:
            self.inorder(node.left)
            print(node.value)
            self.inorder(node.right)

    # 后序遍历
    def postorder(self, node):
        if node is not None:
            self.postorder(node.left)
            self.postorder(node.right)
            print(node.value)

class Solution:
    def isValidBST(self, root):
        """
        :type root: TreeNode
        :rtype: bool
        """
        def checkBST(node, left, right):
            if not node:
                return True
            if not left < node.value < right:
                return False
            return checkBST(node.left, left, node.value) and checkBST(node.right, node.value, right)

        return checkBST(root, float('-inf'), float('inf'))

if __name__ == '__main__':
    # 构建二叉树
    root = Node(5)
    root.left = Node(2)
    root.right = Node(6)
    root.left.left = Node(1)
    root.left.right = Node(4)
    root.right.right = Node(7)

    # 判断二叉树是否是BST
    solution = Solution()
    is_BST = solution.isValidBST(root)
    print(is_BST)

在这个程序中,我们首先创建了一棵二叉树,并将它保存为root。然后,我们创建了一个名为solution的Solution对象,并使用它的isValidBST()方法来查找给定二叉树中是否存在BST。最后,我们打印了结果,表示这个二叉树是否是BST。

结论

在Python中,我们可以使用类来实现二叉树,并使用递归来遍历它。要查找给定二叉树中是否存在BST,我们可以使用递归来比较当前节点和它的左右子节点,以及它们的值与左右边界之间的关系。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程