【问题标题】:binary search tree - recursive insertion python二叉搜索树 - 递归插入python
【发布时间】:2017-06-25 10:27:05
【问题描述】:

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

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.修正你的缩进。 2 请发布您的所有代码,包括insert_element
  • 修复缩进并发布其余代码!对之前的错误感到抱歉:/

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


【解决方案1】:

问题在于这一行:

self.__root.right_child._recursive_insert(self.__root, value)

还有这个:

self.__root.left_child._recursive_insert(self.__root, value)

您已将_recursive_insert 定义为Binary_Search_Tree 的方法,但您在self.__root.xxxxx_child._recursive_insert 中使用__BST_Node 的实例调用它,其中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. 每次递归调用时,您的函数都被传递相同的值,因此它无法知道该做什么。节点的新参数必须跨调用传递。这使得建立基本情况并返回成为可能。

【讨论】:

  • 感谢您的反馈,我在我的实例中容易混淆,我正在努力提高我对何时、调用什么以及实例起源的了解。您的解决方案很有效!
猜你喜欢
  • 1970-01-01
  • 2011-12-15
  • 2021-09-01
  • 1970-01-01
  • 2021-07-03
  • 2019-04-17
  • 2018-02-06
  • 2015-06-16
相关资源
最近更新 更多