二进制搜索树插入Python
我的插入函数有什么问题?我正在传递我希望插入的二进制搜索树插入Python,python,binary-search-tree,Python,Binary Search Tree,我的插入函数有什么问题?我正在传递我希望插入的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 =
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)
提前谢谢
错误:
它是一个测试函数,基本上告诉我输入的内容是否是我想要输出的内容。因此,在二叉树中插入元素的方式通常是从根节点开始,然后决定要插入元素的哪一侧,即哪一子树。一旦做出决定,您将递归地将元素插入到该子树中,并将其根节点视为新的根节点 但是,您在函数中所做的是,您只需立即创建一个具有新值的新子树,而不是朝着树的叶子向下移动(通常会弄乱现有树) 理想情况下,二叉树插入应该如下所示:
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
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
类型有什么区别,所以我只是在这里使用一个类型节点
,构造函数接受这个值作为第一个参数,然后左、右子树作为第二个和第三个。由于二进制文件不需要平衡任何内容,因此可以在每一步遍历时编写尽可能简单的逻辑
-->与根值进行比较
-->它是否小于根,然后转到左节点
-->不大于根,然后转到右节点
-->节点是否存在?将其设为新根并重复,否则使用该值添加新节点
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
def插入(self,val):
树节点=节点(val)
放置=0
tmp=self.root
如果不是self.root:
self.root=treeNode
其他:
虽然(未放置):
如果你的勇气似乎没有多大意义,那该怎么办?你得到了什么错误?否则(如果tr!=None):如果el(一个int)大于tr的父级,那么在左侧创建一个新树并使子级=None,如果el小于tr的父级,那么将其分配给右子级也许这没有意义,因为那样的话,我就再也不会让孩子去增加另一个等级了。。。老实说,我不明白这一点,我会用不同的方式编写函数,你有很多不需要的东西,
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