我尝试使用递归插入函数正确构造二叉搜索树,这将允许我初始化树并继续添加节点(词干)。这是我到目前为止所做的代码(编码更新,所以可能太罗嗦了):
class Binary_Search_Tree:
class __BST_Node:
def __init__(self, value):
self.value = value
self.right_child = None
self.left_child = None
def __init__(self):
self.__root = None
self.__height = 0
self.value = None
def _recursive_insert(self, value):
new_stem = Binary_Search_Tree.__BST_Node(value)
if self.__root is None:
self.__root = new_stem
self.__root.value = new_stem.value
else:
if self.__root.value > new_stem.value:
if self.__root.right_child is None:
self.__root.right_child = new_stem
self.__root.right_child.value = new_stem.value
else:
self.__root.right_child._recursive_insert(self.__root, value)
else:
if self.__root.left_child is None:
self.__root.left_child = new_stem
self.__root.left_child.value = new_stem.value
else:
self.__root.left_child._recursive_insert(self.__root, value)
def insert_element(self, value):
element_to_insert = self._recursive_insert(value)
return element_to_insert
然后我尝试在main方法中为这个新树添加值:
if __name__ == '__main__':
new = Binary_Search_Tree()
new.insert_element(23)
new.insert_element(42)
new.insert_element(8)
new.insert_element(15)
new.insert_element(4)
new.insert_element(16)
我一直得到的错误是:'__BST_Node' object has no attribute '_recursive_insert'
这在插入第一个元素后弹出,所以我猜测错误发生在else语句的某个地方。如果有人能够弄清楚我的错误在哪里或者有关于如何使这些代码更具可读性/用户友好性的任何提示,我将非常感激!
答案 0 :(得分:0)
问题在于这一行:
self.__root.right_child._recursive_insert(self.__root, value)
以及:
self.__root.left_child._recursive_insert(self.__root, value)
您已将_recursive_insert
定义为Binary_Search_Tree
的方法,但您在__BST_Node
中使用self.__root.xxxxx_child._recursive_insert
的实例调用它,其中xxxx_child
是BST_Node的一个实例。
事实上,您的整个_recursive_insert
函数仍然有待改进。您没有从中返回任何内容,但是您将其(不存在的)返回值分配给insert_element
中的内容。
固定代码:
def _recursive_insert(self, root, value):
new_stem = Binary_Search_Tree.__BST_Node(value)
if root is None:
root = new_stem
else:
if root.value < new_stem.value:
if root.right_child is None:
root.right_child = new_stem
else:
root = self._recursive_insert(root.right_child, value)
elif root.value > new_stem.value:
if root.left_child is None:
root.left_child = new_stem
else:
root = self._recursive_insert(root.left_child, value)
return root
def insert_element(self, value):
self.__root = self._recursive_insert(self.__root, value)
return element_to_insert