📜  门| GATE-CS-2016(套装2)|问题 5(1)

📅  最后修改于: 2023-12-03 15:12:43.759000             🧑  作者: Mango

门| GATE-CS-2016(套装2)|问题 5

这是一道考试中的编程问题,题目要求实现一个虚拟的二叉搜索树,支持添加节点、查询某个节点是否存在、以及计算树中节点的个数等基本操作。

为了解决这个问题,我们可以使用Python实现一个类,表示二叉搜索树:

class Node:
    def __init__(self, value):
        self.left = None
        self.right = None
        self.value = value
        
class BinarySearchTree:
    def __init__(self):
        self.root = None
        self.count = 0
        
    def add(self, value):
        if self.root is None:
            self.root = Node(value)
        else:
            self._add(value, self.root)
        self.count += 1
    
    def _add(self, value, node):
        if value < node.value:
            if node.left is None:
                node.left = Node(value)
            else:
                self._add(value, node.left)
        else:
            if node.right is None:
                node.right = Node(value)
            else:
                self._add(value, node.right)
                
    def contains(self, value):
        return self._contains(value, self.root)
    
    def _contains(self, value, node):
        if node is None:
            return False
        elif node.value == value:
            return True
        elif value < node.value:
            return self._contains(value, node.left)
        else:
            return self._contains(value, node.right)
            
    def size(self):
        return self.count

上述代码中,我们定义了两个类,一个表示节点(Node),另一个表示二叉搜索树(BinarySearchTree)。其中,二叉搜索树包含一个根节点(root)和一个计数器(count),计数器用于统计树中节点的个数。

实现过程中,我们采用递归的方式向树中添加节点、查找某个节点是否存在以及计算节点的个数。具体地,添加节点的递归操作来自于节点在二叉搜索树中的排列顺序,如果节点的值小于当前节点,则将其插入当前节点的左子树,否则插入右子树。查询节点是否存在时,同样采用递归的方式,借助节点之间的大小关系,从根节点开始逐级比较。计算节点个数的方法即为计数器的值。

我们可以测试一下实现的这个二叉搜索树:

tree = BinarySearchTree()
tree.add(5)
tree.add(3)
tree.add(7)
print(tree.contains(3))
print(tree.contains(8))
print(tree.size())

以上代码中,我们先创建一个二叉搜索树对象,依次向树中添加了值为5、3和7的节点,然后分别测试树中是否包含值为3和8的节点,最后输出树中节点的个数。运行结果如下:

True
False
3

至此,我们就完成了这道考试题目的实现。