二叉搜索树 - 递归插入python

时间:2017-06-25 01:58:11

标签: python-3.x binary-search-tree

我尝试使用递归插入函数正确构造二叉搜索树,这将允许我初始化树并继续添加节点(词干)。这是我到目前为止所做的代码(编码更新,所以可能太罗嗦了):

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语句的某个地方。如果有人能够弄清楚我的错误在哪里或者有关于如何使这些代码更具可读性/用户友好性的任何提示,我将非常感激!

1 个答案:

答案 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
  1. 您的函数未返回更新的根
  2. 当插入的值等于现有值时,您的函数不处理这种情况,从而导致虚假条目。
  3. 每次递归调用时,您的函数都会传递相同的值,因此无法知道该怎么做。必须跨调用传递节点的新参数。这样就可以建立一个基本案例并返回。