【问题标题】:Python 3: Binary Search Tree failed to set nodesPython 3:二叉搜索树无法设置节点
【发布时间】:2018-07-26 03:43:23
【问题描述】:

所以我一直致力于实现二叉搜索树的此类项目。教授希望我们使私有递归变得简单,同时使公共递归简单。 (比如什么时候insert_element(50),它调用一个私有函数recursive_insert(50, self.__root)来解决)。

我的插入函数运行没有错误,但测试用例总是返回空,这是我的私有函数代码:

class Binary_Search_Tree:


 class __BST_Node:

 def __init__(self, value):
  self.value = value
  self.left=None   
  self.right=None

def __init__(self):
  self.__root = None
  self.__height=0
  self.__size=0

def _in_order_str(self, root):
  if root is None:
    outcome= "[ ]"
  elif self.__size==1:
    outcome = "[ " + str(root.value) + " ]"
  else:
    outcome = "[ "
    self._in_order_str(root.left)
    outcome += str(root.value) +", "
    self._in_order_str(root.right)
    outcome+= " ]"
  return outcome

def _recur_ins(self, val,root):
  if root is None:
    root=Binary_Search_Tree.__BST_Node(val)
  elif root.value>val:
    root.left = _recur_ins(val,root.left) #do I need self here?
  elif root.value <val:
    root.right = _recur_ins(val,root.right)
  return root

这个是给公众的:

def insert_element(self, value):
  self._recur_ins(value,self.__root)
  self.__size+=1 

我的测试用例:

  def test_insertion_from_empty(self):
    root=None
    self.__bst.insert_element(50)
    self.__bst.insert_element(30)
    self.__bst.insert_element(70)
    self.assertEqual('[ 30, 50, 70 ]', self.__bst.in_order())

更新:我认为问题来自我的_in_order_str(self, root): 方法。我在网上找到的一般情况是:

def inorder(root):
    if root is not None:
        inorder(root.left)
        print root.key
        inorder(root.right)

我知道这可能是一个非常愚蠢的问题,但我自己真的无法弄清楚。任何帮助将不胜感激,非常感谢您!!!

【问题讨论】:

  • 您的 _in_order_str() 方法递归地调用自己的子树 - 并完全忽略它们的返回值。你期望它如何工作?
  • Python风格备注:缩进请使用4个空格。 Python 几乎不可读,只有 1 或 2 个空格;很难分辨哪些块在哪里。此外,运算符和函数参数之间的空格对于可读性很重要。
  • @jasonharper 你能指定我如何忽略返回值吗?太感谢了! (我在网上看到了按顺序 str 的一般实现,所以我尝试对其进行修改以适应我教授的要求:“[]”表示空树,“[1]”表示一个值,“[1,2,3]”给别人
  • @ggorlen 感谢您的通知!这个作业的缩进风格受到教授的限制,但我在编写自己的代码时一定会注意这一点和间距!
  • @jasonharper 我想通了!非常感谢!

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


【解决方案1】:

在尽可能少地更改代码后,我想我已经设法让它工作了。

from pprint import pprint  # For debugging

class Binary_Search_Tree:
    class __BST_Node:
        def __init__(self, value):
            self.value = value
            self.left = None
            self.right = None

    def __init__(self):
        self.__root = None
        self.__height = 0
        self.__size = 0

    def __in_order_str(self, root):
        if root is None:
            outcome = "[ ]"
        elif self.__size == 1:
            outcome = "[ " + str(root.value) + " ]"
        else:
            outcome = "[ "
            self.__in_order_str(root.left)
            outcome += str(root.value) + ", "
            self.__in_order_str(root.right)
            outcome += " ]"
        return outcome

    def __recur_ins(self, val, root):
        if root is None:
            root = Binary_Search_Tree.__BST_Node(val)
        elif root.value > val:
            root.left = self.__recur_ins(val, root.left)
        elif root.value < val:
            root.right = self.__recur_ins(val, root.right)
        return root

    def insert_element(self, value):
        self.__root = self.__recur_ins(value, self.__root)
        self.__size += 1

    def test_insertion_from_empty(self):
        self.insert_element(50)
        self.insert_element(60)
        self.insert_element(70)
        # self.assertEqual('[ 30, 50, 70 ]', self.__bst.in_order())


test = Binary_Search_Tree()
test.test_insertion_from_empty()
pprint(vars(test))

更改说明:

  • 将一些函数(_recur_ins, _in_order_str) 从使用 '_' 更改为 '__' 以使其成为私有函数。我是根据Python Official Documentation 做的,私有函数至少使用两个前导下划线,最多使用一个尾随下划线。

  • insert_element 中的第一行,添加了 'self.__root=' 以便将返回的根值存储为新的根

  • 添加了“自我”。在 '__recur_ins' 前面,因为据我所知,当您需要调用位于同一类中的函数时,您必须使用 self。
  • 我没有在 __in_order_str 中做太多修改,因为我认为作者只是要求插入 (?)
  • 评论了 assertEqual,因为问题 (?) 中没有提供任何函数
  • 修改了空格,使其更具可读性

如果我在转储变量之前设置了调试模式,这就是我得到的:

我认为应该是正确的。先插入50,因此作为根,然后将60插入50的右孩子,再将70放入60的右孩子。

注意:我也是新手,有什么错误请告诉我,我会改正的:)

【讨论】:

  • 非常感谢您的调试!我想你是对的!由于插入方法应该是正确的,我认为问题实际上来自in_order_str
  • 我的意思是说您的更正(尤其是 2 和 3)更新了我的根目录!现在我只需要在__in_order_str() 上工作即可正确打印它。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-31
  • 1970-01-01
相关资源
最近更新 更多