我正在尝试实现bst的插入功能,但是我的递归方法仅插入第一个值。我的方法是遍历直到空孩子,然后将该节点设置为新值。
class BSTNode(object):
def __init__(self, val):
self.val = val
self.left = None
self.right = None
def insert(self, val):
if self.root is None:
self.root = BSTNode(val)
else:
self.insertNode(self.root,val)
def insertNode(self,node, val):
if node is None:
node = BSTNode(val)
return
elif val <= node.val:
node.left = self.insertNode(node.left, val)
elif val > node.val:
node.right = self.insertNode(node.right, val)
bst = new BST()
bst.insert(5)
bst.insert(10)
答案 0 :(得分:2)
您不会在BSTNode
中返回insertNode
(因此您创建了一个节点,但返回了None
)。您应该改为:
if node is None:
return BSTNode(val)
因此完整方法变为:
def insertNode(self, node, val):
if node is None:
return BSTNode(val)
elif val <= node.val:
node.left = self.insertNode(node.left, val)
elif val > node.val:
node.right = self.insertNode(node.right, val)
return node
答案 1 :(得分:1)
首先创建一个节点类可能会有所帮助...单独考虑一个节点比考虑一棵树要容易。
class Node:
def __init__(self,value):
self.value = value
self.left = None
self.right = None
def insert_value(self,value):
# there are 3 cases
if not self.value: # in one case this node has no value
self.value = value
elif value < self.value: # if value is less than this nodes value
# then insert it to the left
if not self.left:
self.left = Node(value)
else:
self.left.insert_value(value)
else: # otherwise if value is greater than or equal to this nodes value
# then insert it to the right
if not self.right:
self.right = Node(value)
else:
self.right.insert_value(value)
一旦有了这个Node
类,树的实现就变得微不足道了。
class BST:
def __init__(self,root_value=None):
self.root = Node(root_value)
def insert_value(self,value):
self.root.insert_value(value)
bst = BST()
bst.insert_value(5)
bst.insert_value(10)
print(bst.root)
现在,您当然不必以这种方式解决此问题了……但是(至少对我来说)它使推理变得更容易。