使用Python将记录存储在二叉树中

时间:2018-10-18 21:54:13

标签: python algorithm data-structures

我想将学生记录存储在二叉树中。我正在Python中实现它。

学生记录将具有三个值,

two :: Computation Int
two = name "two" $ pure 2

someComp :: Computation Int
someComp = name "two plus two" $ liftA2 (+) two two

示例

StudentName, RollNo, Grade

我可以实现一个二进制树,并在其中插入单个值。但是,要存储学生记录,我是否需要使用三个二叉树?然后如何映射值?

这是python中带有单值插入的简单B-Tree实现。

John 4 A
Josh 2 B
Kevin 3 A

推荐的实现方式是什么?

我想查询类似

#!/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)

1 个答案:

答案 0 :(得分:0)

如果名称唯一需要查找单个记录的键,则可以使用按名称排序的一棵树。但是,每个节点必须存储 while记录。您可以引入具有所有三个字段但定义<>==(用于Tree._find)的类型以仅比较名称,或为{添加支持{1}}用于使用自定义的比较器函数。

后者是可取的,因为它避免了在其他代码中为运算符建立奇怪的含义;如果一个函数实现了Tree,那么一个函数就足够了,因为您可以编写

<