【发布时间】: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