📜  门| Gate IT 2007 |问题13(1)

📅  最后修改于: 2023-12-03 14:58:23.698000             🧑  作者: Mango

门 | Gate IT 2007 | 问题13

本题为2007年“门”(Gate)考试中的问题13,是一道关于树的问题。要求实现一个算法,判断一棵有根树是否为二叉搜索树。

问题描述

给定一棵有根树,每个节点都有一棵子树。我们想要判断这棵树是否为二叉搜索树。

要求实现一个算法,判断这棵树是否为二叉搜索树。如果是,则返回"YES",否则返回"NO"。

解决方案
算法思路

由于题目中要求的是一棵有根树是否为二叉搜索树,因此需要使用二叉搜索树的特性来判断。对于一棵二叉搜索树而言,对于任意一个节点,它的左子树的所有节点的值都小于这个节点的值;而它的右子树的所有节点的值都大于这个节点的值。因此,我们可以采用深度优先搜索的方法,在每个节点处,判断它的左子树与右子树是否满足上述条件。

代码实现
class Node:
    def __init__(self, val):
        self.val = val
        self.left = None
        self.right = None

def is_bst(root, lower=float('-inf'), upper=float('inf')):
    if not root:
        return True
    if not lower < root.val < upper:
        return False
    return is_bst(root.left, lower, root.val) and is_bst(root.right, root.val, upper)

# 测试样例
root = Node(5)
root.left = Node(3)
root.right = Node(8)
root.left.left = Node(1)
root.left.right = Node(4)
root.right.left = Node(6)
root.right.right = Node(10)
print(is_bst(root)) # True

上述代码中,我们定义了一个Node类,表示树的每个节点。is_bst函数就是判断一棵树是否为二叉搜索树的函数。它的输入参数root表示根节点;lower和upper表示二叉搜索树中所有节点的值的界限,初始值为负无穷和正无穷。在每个节点处,我们都判断它的值是否在界限内,并且递归调用左子树和右子树,最终返回一个布尔值。

复杂度分析

算法的时间复杂度为O(n),其中n为树中的节点数。因为我们需要遍历一遍树,并且在每个节点处进行一次判断。空间复杂度为O(h),其中h为树的高度。因为我们需要递归遍历树,空间复杂度取决于树的深度。