在Python中将学生记录添加到二进制搜索树

时间:2017-06-13 02:05:10

标签: python binary-tree binary-search-tree

很抱歉所有的代码,但对于我正在处理的这项任务,由于参考不同,这是必要的。

本章我们正在使用二叉树和二叉搜索树。 我测试了BinaryTree()和BinarySearchTree()类没有问题。

我的问题是:我们将记录添加到二元搜索树中,如Student类和main()函数中所示,以测试该类。根据作业:

  

Student类有一个id和名字,getter和setter,一个 str ()函数,这样你就可以打印学生记录,操作==,!=,< =, <,> =,>定义。比较运算符比较了唯一的学生ID。由于我们可以比较学生记录,我们现在可以将它们放入二进制搜索树中。

我的问题是,如果所有初始化变量与BinaryTree()类和BinarySearchTree()类中的变量完全不同,如何将记录添加到二叉树中?

每次运行代码时,都会出现以下错误:

  

AttributeError:'Student'对象没有属性'insert'

isEmpty() = True
None
isEmpty() = False
None
101(Betty Smith)
101(Betty Smith)
Traceback (most recent call last):
  File "/Users/phillipward/Desktop/Lab 10/StudentRecordsTest.py", line 50, in <module>
    main()
  File "/Users/phillipward/Desktop/Lab 10/StudentRecordsTest.py", line 22, in main
    BST.insert(Student(42, "Amy Winchester"))
  File "/Users/phillipward/Desktop/Lab 10/BinarySearchTree.py", line 13, in insert
    self.getleftChild().insert(data)
  File "/Users/phillipward/Desktop/Lab 10/BinarySearchTree.py", line 7, in insert
    if(self.isEmpty()):
  File "/Users/phillipward/Desktop/Lab 10/binaryTree.py", line 33, in isEmpty
    if(self is None or self.data is None):
AttributeError: 'Student' object has no attribute 'data'

我坚持如何告诉程序我的学生班级是BinarySearchTree的一种。

class BinaryTree():
    def __init__(self, data = None, leftChild = None, rightChild = None):
        self.data = data
        self.leftChild = leftChild
        self.rightChild = rightChild

    def getData(self):
        return self.data

    def setData(self, x):
        self.data = x
        return self.data

    def getleftChild(self):
        return self.leftChild

    def setleftChild(self, x):
        self.leftChild = x
        return self.leftChild

    def getrightChild(self):
        return self.rightChild

    def setrightChild(self, x):
        self.rightChild = x
        return self.rightChild

    def isEmpty(self):
        if(self is None or self.data is None):
            return True
        else:
            return False

    def __str__ (self):
        return "{0}".format(self.data)

    def inOrderTraversal(self):
        if (self is None):
            return "Empty"
        else:
            result = ""
            if(self.getleftChild() is not None):     # When we put payload in, we need equality
                result += BinaryTree.inOrderTraversal(self.getleftChild()) + " "
            result += str(self.getData())
            if (self.getrightChild() is not None):
                result += " " + BinaryTree.inOrderTraversal(self.getrightChild()) + " "
            return result

    def preOrderTraversal(self):
        if (self.isEmpty()):
            return "Empty"
        else:
            result = ""
            result += str(self.getData())
            if (self.getleftChild() is not None):
                result += " " + BinaryTree.preOrderTraversal(self.getleftChild()) + " "
            if (self.getrightChild() is not None):
                result += BinaryTree.preOrderTraversal(self.getrightChild())
            return result

    def postOrderTraversal(self):
        if (self.isEmpty()):
            return "Empty"
        else:
            result = ""
            if (self.getleftChild() is not None):
                result += BinaryTree.postOrderTraversal(self.getleftChild()) + " "
            if (self.getrightChild() is not None):
                result += BinaryTree.postOrderTraversal(self.getrightChild()) + " "
            result += str(self.getData())
            return result

    def insert(self, data):
        if (self.isEmpty()):
            self.setData(data)
        elif (data < self.getData()):
            if (self.getleftChild() is None):
                self.setleftChild(BinarySearchTree(data))
            else:
                self.getleftChild().insert(data)
        else:  # data >= self.getData()
            if (self.getrightChild() is None):
                self.setrightChild(BinarySearchTree(data))
            else:
                self.getrightChild().insert(data)

    def retrieve(self, data):
        if self.isEmpty():
            return None
        elif data == self.getData():
            return self.getData()
        elif data <= self.getData():
            if self.getleftChild() is None:
                return None
            else:
                return self.getleftChild().retrieve(data)
        else:
            if self.getrightChild() is None:
                return None
            else:
                return self.getrightChild().retrieve(data)
from binaryTree import BinaryTree


class BinarySearchTree(BinaryTree):

    def insert(self, data):
        if(self.isEmpty()):
            self.setData(data)
        elif(data < self.getData()):
            if(self.getleftChild() is None):
                self.setleftChild(data)
            else:
                self.getleftChild().insert(data)
        else: #data >= self.getData()
            if(self.getrightChild() is None):
                self.setrightChild(data)
            else:
                self.getrightChild().insert(data)

    def retrieve(self, data):
        if self.isEmpty():
            return None
        elif data == self.getData():
            return self.getData()
        elif data <= self.getData():
            if self.getleftChild() is None:
                return None
            else:
                return self.getleftChild().retrieve(data)
        else:
            if self.getrightChild() is None:
                return None
            else:
                return self.getrightChild().retrieve(data)



    def minValue(self):
        current = self
        while current.leftChild is not None:
            current = current.leftChild
        return current.data


    def maxValue(self):
        current = self
        while current.rightChild is not None:
            current = current.rightChild
        return current.data

    def isBST(self):
        current = self
        if current == None:
            return True
        if current.leftChild.data <= current.data and 
    current.rightChild.data >= current.data:
            return True
        else:
            return False
class Student():

    def __init__(self, id = None, name = ""):
        self.__id = id
        self.__name = name

    def getId(self):
        return self.__id

    def setId(self, id):
        self.__id = id

    def getName(self):
        return self.__name

    def setName(self, name):
        self.__id = name

    def __str__(self):
        if (self is None):
            return ""
        else:
            return str(self.__id) + "(" + self.__name + ")"

    def __cmp__(self, other):
        if (self is None or other is None):
            return 0
        else:
            return self.__id - other.__id

    def __eq__(self, other):
        return self.__cmp__(other) == 0

    def __ne__(self, other):
        return self.__cmp__(other) != 0

    def __lt__(self, other):
        return self.__cmp__(other) < 0

    def __le__(self, other):
        return self.__cmp__(other) <= 0

    def __gt__(self, other):
        return self.__cmp__(other) > 0

    def __ge__(self, other):
        return self.__cmp__(other) >= 0
from BinarySearchTree import BinarySearchTree
from Student import Student


def main():

    BST = BinarySearchTree()

    print("isEmpty() = " + str(BST.isEmpty()))
    print(BST)

    BST.setData(Student(101, "Betty Smith"))
    print("isEmpty() = " + str(BST.isEmpty()))
    print(BinarySearchTree())

    BST.insert(Student(50, "John Adams"))
    print(BST)

    BST.insert(Student(250, "Mike Jones"))
    print(BST)

    BST.insert(Student(42, "Amy Winchester"))
    print(BST)

    BST.insert(Student(31, "Jill Ranger"))
    print(BST)

    BST.insert(Student(315, "Bob Crachet"))
    print(BST)

    BST.insert(Student(200, "Karen Wilkins"))
    print(BST)
    print("\n")

    print()
    print("Inorder traversal: " + str(BST))
    print()
    print("Preorder traversal: \n" + BST.preOrderTraversal())
    print()
    print("Postorder traversal: " + BST.postOrderTraversal())

    print()
    print("minValue: " + str(BST.minValue()))
    print("maxValue: " + str(BST.maxValue()))
    print()
    print("isBST = " + str(BST.isBST()))

    for id in [101, 200, 31, 50, 315, 250, 42]:
        print(BST.retrieve(Student(id)))

main()

0 个答案:

没有答案