二进制搜索树插入Python

时间:2014-11-15 22:00:59

标签: 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 = createEyecuBST( el,tr )
        else:
            tr.right = createEyecuBST( el,tr )
        return EyecuBST( tr.left,tr.right,tr)

提前致谢。

ERROR:


ValueError: Not expected BST with 2 elements

它是一个测试功能,基本上告诉我我所投入的是否是我想要的。

2 个答案:

答案 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

您还可以使函数递归,但它不应返回任何内容。它将只是将节点附加到最里面的调用中。