二进制搜索树插入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