📌  相关文章
📜  教资会网络 | UGC NET CS 2015 年 6 月 – III |问题 54(1)

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

教资会网络 | UGC NET CS 2015 年 6 月 – III | 问题 54

介绍

本题要求使用 Python 语言编写一个程序,对一个二叉查找树(BST)进行操作。BST 是一种满足以下条件的二叉树:

  • 每个节点都有一个键值,且该键值大于等于其左子树节点的键值,小于等于其右子树节点的键值。
  • 没有相同键值的节点。

程序要求实现以下操作:

  1. 插入一个节点。
  2. 删除一个节点。
  3. 搜索一个节点。
  4. 遍历输出所有节点的键值。

程序运行时,输入为一个序列,其中第一个数字为序列中节点的总数。

实现

代码实现思路如下:

首先定义一个节点类,每个节点有两个孩子节点和一个键值。然后定义一个二叉查找树类,包含插入节点方法、删除节点方法、搜索节点方法、以及遍历输出所有节点键值方法。

插入节点方法实现过程为:从根节点开始,如果要插入的节点键值小于当前节点或者当前节点不存在左孩子,就将节点插入到当前节点的左子树中;否则,就将节点插入到当前节点的右子树中。

删除节点方法实现过程为:首先搜索要删除的节点。如果节点没有子孩子,就直接将其从树中删除。如果节点只有一个孩子,就将其孩子节点上移到父节点位置。如果节点有两个孩子,就将其左子树的最右节点或者右子树的最左节点移动到当前节点位置,然后删除原节点。

搜索节点方法实现过程为:从根节点开始,如果要搜索的节点键值小于当前节点,就继续往左子树搜索;如果要搜索的节点键值大于当前节点,就继续往右子树搜索;如果相等,就找到了要搜索的节点。

遍历输出所有节点键值方法实现过程为:分别输出左子树、当前节点、右子树的键值。

代码实现如下:

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

class BST:
    def __init__(self):
        self.root = None

    def insert(self, key):
        node = Node(key)
        if self.root is None:
            self.root = node
        else:
            curr = self.root
            while True:
                if key < curr.key:
                    if curr.left is None:
                        curr.left = node
                        break
                    else:
                        curr = curr.left
                else:
                    if curr.right is None:
                        curr.right = node
                        break
                    else:
                        curr = curr.right

    def delete(self, key):
        node = self.root
        parent = None
        while node is not None and node.key != key:
            parent = node
            if key < node.key:
                node = node.left
            else:
                node = node.right
        if node is None:
            return
        if node.left is None and node.right is None:
            if node == self.root:
                self.root = None
            elif parent.left == node:
                parent.left = None
            else:
                parent.right = None
        elif node.left is None:
            if node == self.root:
                self.root = node.right
            elif parent.left == node:
                parent.left = node.right
            else:
                parent.right = node.right
        elif node.right is None:
            if node == self.root:
                self.root = node.left
            elif parent.left == node:
                parent.left = node.left
            else:
                parent.right = node.left
        else:
            parent = node
            left = node.left
            while left.right is not None:
                parent = left
                left = left.right
            node.key = left.key
            if parent == node:
                parent.left = left.left
            else:
                parent.right = left.left

    def search(self, key):
        node = self.root
        while node is not None and node.key != key:
            if key < node.key:
                node = node.left
            else:
                node = node.right
        return node

    def traverse(self, node):
        if node is None:
            return
        self.traverse(node.left)
        print(node.key)
        self.traverse(node.right)

    def from_list(self, lst):
        for key in lst:
            self.insert(key)

其中, from_list 方法用于将一个列表转为二叉查找树。运行程序并测试其正确性。