Я хочу сохранить запись студентов в двоичном дереве. Я реализую его в 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
Если единственным ключом, по которому нужно искать отдельные записи, является имя, вы можете использовать одно дерево, отсортированное по имени. Однако каждый узел должен хранить запись while. Вы либо вводите тип, который имеет все три поля, но определяет <
, >
и ==
(используется в Tree._find
) для сравнения только имени или добавления поддержки Tree
для использования пользовательской функции компаратора.
Последнее предпочтительнее, поскольку оно позволяет избежать странного смысла для операторов в другом коде; одной функции достаточно, если она реализует <
, потому что вы можете написать
if less(val,node.v): # ...
elif less(node.v,val): # ...
else: return node # equal