我试图使用递归在二叉搜索树中插入值,但是当我使用inorder遍历运行它时,我得到None的输出。我试图看看实现这个的其他语言,我只是尝试复制它,但它不起作用。我将树的根传递给插入函数,我期望它如果不为空则向左或向右移动。有人可以告诉我这有什么问题。我尝试将bst.root设为bst.get_root(),但仍会产生相同的结果。
class Node:
def __init__(self, value):
self.value = value
self.left = None
self.right = None
class BinaryTree:
def __init__(self):
self.root = None
self.size = 0
def get_size(self):
return self.size
def get_root(self):
return self.root
def insert(self, root, value):
if root is None:
root = Node(value)
else:
if value < root.value:
root.left = self.insert(root.left, value)
else:
root.right = self.insert(root.right, value)
return root
def inorder(self, root):
if root == None:
return
else:
self.inorder(root.left)
print(root.value, end=" -> ")
self.inorder(root.right)
bst = BinaryTree()
bst.insert(bst.root, 2)
bst.insert(bst.root, 4)
bst.insert(bst.root, 3)
bst.insert(bst.root, 1)
print(bst.inorder(bst.root))
答案 0 :(得分:3)
问题是,node
可能是None
并且您正在使用它来调用函数,然后将节点分配给None
并且不会保存任何内容。
让我们有一个战利品:
def insert(self, root, value): # say root is None
if root is None:
root = Node(value) # here we're doing: `None = Node(value)`
else:
if value < root.value:
root.left = self.insert(root.left, value)
else:
root.right = self.insert(root.right, value)
return root
为了解决这个问题,我们需要提升一个级别&#34;如果node.left
是None
,那么请分配给node.left
(顺便说一句,root是一个坏名字,所以我使用&#34; node&#34;而不是)
一种方法是:
def insert(self, value): # this is the function that gets called, pay attention that we're not sending `root`
if self.root is None:
self.root = Node(value)
else:
self._insert(self.root, value) # here's the call to a "private" function to which we are passing nodes down, starting from root
def _insert(self, node, value):
if value < node.value: # we know that `node` cannot be None - so it's safe to check its value!
if node.left:
self._insert(node.left, value) # the recursive call is done only when `node.left` is not None
else:
node.left = Node(value) # direct assignment
else:
if node.right:
self._insert(node.right, value)
else:
node.right = Node(value) # direct assignment
两条评论:
现在有一个更干净的界面,看看插入调用现在看起来如何:
bst = BinaryTree()
bst.insert(2)
bst.insert(4)
bst.insert(3)
bst.insert(1)
insert是一个&#34;设置&#34;一个值,因此 - 它不必返回任何东西(但如果你真的想要的话,它可以。)
答案 1 :(得分:-2)
问题是您从未将插入结果分配给根节点。查看方法插入以及如何为self.root分配_insert的返回值。
class Node:
def __init__(self, value):
self.value = value
self.left = None
self.right = None
class BinaryTree:
def __init__(self):
self.root = None
self.size = 0
def get_size(self):
return self.size
def get_root(self):
return self.root
def insert(self, value):
self.root = self._insert(self.root, value)
def _insert(self, root, value):
if root is None:
root = Node(value)
elif value < root.value:
root.left = self._insert(root.left, value)
elif value >= root.value:
root.right = self._insert(root.right, value)
return root
def inorder(self, root):
if root == None:
return
else:
self.inorder(root.left)
# print(root.value, end=" -> ")
print(root.value)
self.inorder(root.right)
bst = BinaryTree()
bst.insert(2)
bst.insert(4)
bst.insert(3)
bst.insert(1)
print(bst.inorder(bst.root))
修改强> 主要问题是插入调用的结果未保存到root中。如果您按照以下方式更改原始代码,它也将起作用:
bst = BinaryTree()
bst.root = bst.insert(bst.root, 2)
bst.root = bst.insert(bst.root, 4)
bst.root = bst.insert(bst.root, 3)
bst.root = bst.insert(bst.root, 1)