我的插入功能有什么问题?我传递了tr
以及我要插入的元素el
,但我一直在收到错误......
def insert( tr,el ):
""" Inserts an element into a BST -- returns an updated tree """
if tr == None:
return createEyecuBST( el,None )
else:
if el > tr.value:
tr.left = createEyecuBST( el,tr )
else:
tr.right = createEyecuBST( el,tr )
return EyecuBST( tr.left,tr.right,tr)
提前致谢。
ERROR:
ValueError: Not expected BST with 2 elements
它是一个测试功能,基本上告诉我我所投入的是否是我想要的。
答案 0 :(得分:1)
因此,插入二叉树通常有效的方法是从根节点开始,然后决定要插入元素的哪一面,即哪个子树。做出决定后,您将递归地将元素插入到该子树中,将其根节点视为新的根节点。
但是,你在函数中所做的是,不是向树的叶子下去,而是立即用新值创建一个新的子树(通常会弄乱现有的树)。
理想情况下,二叉树插入应如下所示:
def insert (tree, value):
if not tree:
# The subtree we entered doesn’t actually exist. So create a
# new tree with no left or right child.
return Node(value, None, None)
# Otherwise, the subtree does exist, so let’s see where we have
# to insert the value
if value < tree.value:
# Insert the value in the left subtree
tree.left = insert(tree.left, value)
else:
# Insert the value in the right subtree
tree.right = insert(tree.right, value)
# Since you want to return the changed tree, and since we expect
# that in our recursive calls, return this subtree (where the
# insertion has happened by now!).
return tree
注意,这会修改现有树。您还可以将树视为不可变状态,其中插入元素会创建一个全新的树而不会触及旧树。由于您始终使用createEyecuBST
,因此这可能是您的初衷。
为此,您希望始终返回一个新创建的子树,表示该子树的已更改状态。它看起来像这样:
def insert (tree, value):
if tree is None:
# As before, if the subtree does not exist, create a new one
return Node(value, None, None)
if value < tree.value:
# Insert in the left subtree, so re-build the left subtree and
# return the new subtree at this level
return Node(tree.value, insert(tree.left, value), tree.right)
elif value > tree.value:
# Insert in the right subtree and rebuild it
return Node(tree.value, tree.left, insert(tree.right, value))
# Final case is that `tree.value == value`; in that case, we don’t
# need to change anything
return tree
注意:由于我不知道createEyecuBST
函数与EyecuBST
类型的区别是什么,我只是在这里使用类型Node
,其中constructer接受该值作为第一个参数,然后左右子树作为第二个和第三个。
答案 1 :(得分:0)
由于二进制文件不需要平衡任何内容,因此在遍历每一步时可以编写尽可能简单的逻辑。
->与根值进行比较。
->它是否小于root,然后转到左侧节点。
->不大于root,然后转到右节点。
->节点是否存在?使其成为新的根节点并重复,否则添加值为
的新节点。def insert(self, val):
treeNode = Node(val)
placed = 0
tmp = self.root
if not self.root:
self.root = treeNode
else:
while(not placed):
if val<tmp.info:
if not tmp.left:
tmp.left = treeNode
placed = 1
else:
tmp = tmp.left
else:
if not tmp.right:
tmp.right = treeNode
placed = 1
else:
tmp = tmp.right
return
您还可以使函数递归,但它不应返回任何内容。它将只是将节点附加到最里面的调用中。