Хранить записи в двоичном дереве, используя Python - PullRequest
0 голосов
/ 19 октября 2018

Я хочу хранить записи студентов в двоичном дереве.Я реализую это в Python.

В записи учащегося будет три значения:

StudentName, RollNo, Grade

Пример,

John 4 A
Josh 2 B
Kevin 3 A

Я могу реализовать одно двоичное дерево и вставить туда одно значение.Но для хранения студенческих записей мне нужно использовать три двоичных дерева?а затем как отобразить значения?

Это простая реализация B-Tree в python с вставкой одного значения.

#!/usr/bin/python

class Node:
    def __init__(self, val):
        self.l = None
        self.r = None
        self.v = val

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

    def getRoot(self):
        return self.root

    def add(self, val):
        if(self.root == None):
            self.root = Node(val)
        else:
            self._add(val, self.root)

    def _add(self, val, node):
        if(val < node.v):
            if(node.l != None):
                self._add(val, node.l)
            else:
                node.l = Node(val)
        else:
            if(node.r != None):
                self._add(val, node.r)
            else:
                node.r = Node(val)

    def find(self, val):
        if(self.root != None):
            return self._find(val, self.root)
        else:
            return None

    def _find(self, val, node):
        if(val == node.v):
            return node
        elif(val < node.v and node.l != None):
            self._find(val, node.l)
        elif(val > node.v and node.r != None):
            self._find(val, node.r)

    def deleteTree(self):
        # garbage collector will do this for us. 
        self.root = None

    def printTree(self):
        if(self.root != None):
            self._printTree(self.root)

    def _printTree(self, node):
        if(node != None):
            self._printTree(node.l)
            print str(node.v) + ' '
            self._printTree(node.r)

#     3
# 0     4
#   2      8
tree = Tree()
tree.add(3)
tree.add(4)
tree.add(0)
tree.add(8)
tree.add(2)
tree.printTree()
print (tree.find(3)).v
print tree.find(10)
tree.deleteTree()
tree.printTree()

Каков рекомендуемый способ достижения этого?

Я хочу запросить, как,

Get the rollNo where studentName='John'

Вывод: -

4

Status (Fetch all the records): -

Вывод: -

John 4 A
Josh 2 B
Kevin 3 A

1 Ответ

0 голосов
/ 19 октября 2018

Если единственным ключом, по которому вам нужно искать отдельные записи, является имя, вы можете использовать одно дерево, отсортированное по имени.Однако каждый узел должен хранить запись while.Вы либо вводите тип, который имеет все три поля, но определяет <, > и == (используется в Tree._find) для сравнения только имени, либо добавляете поддержку Tree для использования пользовательского компаратор функция.

Последнее предпочтительнее, поскольку позволяет избежать установления странного значения для операторов в другом коде;одной функции достаточно, если она реализует <, потому что вы можете написать

if less(val,node.v): # ...
elif less(node.v,val): # ...
else: return node  # equal
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...