python中的递归类定义

zz2j4svz  于 2021-07-13  发布在  Java
关注(0)|答案(1)|浏览(649)

对不起,如果我的英语不好,我的母语是韩语。
我在python3中实现了二叉搜索树,但未能实现我的目标。
代码如下:

class Node(object):

    def __init__(self, key=None, data=None):
        self.key = key
        self.data = data

class BinarySearchTree(object):
    keyfunc = None  # Will it be worse when using lambda x: x as default?

    def __init__(self, node=None):
        self.root = node
        self.left = None
        self.right = None
        # I don't want default to be NoneType, but don't know how for now.

    def add(self, key, data=None):
        node = Node(key, data)
        if self.root is None:
            self.root = node
            return
        parent = self.root.key
        if self.keyfunc is None:
            if key < parent:
                if self.left is None:
                    self.left = __class__(node)
                else:
                    self.left.add(key, data)

            elif key > parent:
                if self.right is None:
                    self.right = __class__(node)
                else:
                    self.right.add(key, data)
        else:
            if keyfunc(key) < keyfunc(parent):
                if self.left is None:
                    self.left = __class__(node)
                else:
                    self.left.add(key, data)
            elif keyfunc(key) > keyfunc(parent):
                if self.right is None:
                    self.right = __class__(node)
                else:
                    self.right.add(key, data)
    def inorder(self):
        if self.root:
            if self.left:
                self.left.inorder()
            print(self.root.key, end=' ')
            if self.right:
                self.right.inorder()

if __name__ == '__main__':
    bst1 = BinarySearchTree()
    arr = [2,6,4,3,2,7,8,1,9,5]
    for key in arr:
        bst1.add(key)
    bst1.inorder()

不管怎样,它还是有用的,但我想要的是:
即使根节点没有子节点,我也希望 bst1.left (或 bst1.right )永远是二进制搜索树。
这样,我可以允许空树与其他树保持一致,也可以删除重复的树 if self.left is None 在add()中。
我不想手动操作 bst1.left = BinarySearchTree(None) 在类定义之后,因为它需要应用于所有节点。
我试过了 self.left = BinarySearchTree(None) (当然这会导致错误的递归),并尝试使用 __new__() 方法和元类,但无法找到解决方案。
如果我能得到帮助,我将非常感激。

nhhxz33t

nhhxz33t1#

考虑更换 NoneType 具有特殊空树对象的子树 None 根。另外,回答你评论中的问题,我认为违约 keyfunc = lambda x: x 是合理的,它进一步简化了代码。

def __init__(self, node):
        self.root = node
        if node is not None:
            self.left = BinarySearchTree(None)
            self.right = BinarySearchTree(None)

    def add(self, key, data=None):
        node = Node(key, data)
        if self.root is None:
            self.root = node
            self.left = BinarySearchTree(None)
            self.right = BinarySearchTree(None)
        else:
            parent = self.root.key
            if keyfunc(key) < keyfunc(parent):
                self.left.add(key, data)
            elif keyfunc(key) > keyfunc(parent):
                self.right.add(key, data)

    def inorder(self):
        if self.root is not None:
            self.left.inorder()
            print(self.root.key, end=' ')
            self.right.inorder()

相关问题