使用python中的递归在二进制搜索树中插入

时间:2017-08-29 06:11:13

标签: python recursion insert binary-search-tree

我试图使用递归在二叉搜索树中插入值,但是当我使用inorder遍历运行它时,我得到None的输出。我试图看看实现这个的其他语言,我只是尝试复制它,但它不起作用。我将树的根传递给插入函数,我期望它如果不为空则向左或向右移动。有人可以告诉我这有什么问题。我尝试将bst.root设为bst.get_root(),但仍会产生相同的结果。

class Node:
    def __init__(self, value):
        self.value = value
        self.left = None
        self.right = None

class BinaryTree:
    def __init__(self):
        self.root = None
        self.size = 0

    def get_size(self):
        return self.size

    def get_root(self):
        return self.root

    def insert(self, root, value):
        if root is None:
            root = Node(value)
        else:
            if value < root.value:
                root.left = self.insert(root.left, value)
            else:
                root.right = self.insert(root.right, value)
        return root

    def inorder(self, root):
        if root == None:
            return
        else:
            self.inorder(root.left)
            print(root.value, end=" -> ")
            self.inorder(root.right)

bst = BinaryTree()
bst.insert(bst.root, 2)
bst.insert(bst.root, 4)
bst.insert(bst.root, 3)
bst.insert(bst.root, 1)

print(bst.inorder(bst.root))

2 个答案:

答案 0 :(得分:3)

问题是,node可能是None并且您正在使用它来调用函数,然后将节点分配给None并且不会保存任何内容。

让我们有一个战利品:

def insert(self, root, value):  # say root is None
    if root is None:
        root = Node(value)  # here we're doing: `None = Node(value)`
    else:
        if value < root.value:
            root.left = self.insert(root.left, value)
        else:
            root.right = self.insert(root.right, value)
    return root 

为了解决这个问题,我们需要提升一个级别&#34;如果node.leftNone,那么请分配给node.left(顺便说一句,root是一个坏名字,所以我使用&#34; node&#34;而不是)

一种方法是:

def insert(self, value):  # this is the function that gets called, pay attention that we're not sending `root`
    if self.root is None:
        self.root = Node(value)
    else:
        self._insert(self.root, value) # here's the call to a "private" function to which we are passing nodes down, starting from root

def _insert(self, node, value):
    if value < node.value:  # we know that `node` cannot be None - so it's safe to check its value! 
        if node.left:
            self._insert(node.left, value) # the recursive call is done only when `node.left` is not None
        else:
            node.left = Node(value)  # direct assignment
    else:
        if node.right:
            self._insert(node.right, value)
        else:
            node.right = Node(value)  # direct assignment

两条评论:

  1. 现在有一个更干净的界面,看看插入调用现在看起来如何: bst = BinaryTree() bst.insert(2) bst.insert(4) bst.insert(3) bst.insert(1)

  2. insert是一个&#34;设置&#34;一个值,因此 - 它不必返回任何东西(但如果你真的想要的话,它可以。)

答案 1 :(得分:-2)

问题是您从未将插入结果分配给根节点。查看方法插入以及如何为self.root分配_insert的返回值。

class Node:
    def __init__(self, value):
        self.value = value
        self.left = None
        self.right = None


class BinaryTree:
    def __init__(self):
        self.root = None
        self.size = 0

    def get_size(self):
        return self.size

    def get_root(self):
        return self.root

    def insert(self, value):
        self.root = self._insert(self.root, value)

    def _insert(self, root, value):
        if root is None:
            root = Node(value)
        elif value < root.value:
            root.left = self._insert(root.left, value)
        elif value >= root.value:
            root.right = self._insert(root.right, value)
        return root

    def inorder(self, root):
        if root == None:
            return
        else:
            self.inorder(root.left)
            # print(root.value, end=" -> ")
            print(root.value)
            self.inorder(root.right)

bst = BinaryTree()
bst.insert(2)
bst.insert(4)
bst.insert(3)
bst.insert(1)

print(bst.inorder(bst.root))

修改 主要问题是插入调用的结果未保存到root中。如果您按照以下方式更改原始代码,它也将起作用:

bst = BinaryTree()
bst.root = bst.insert(bst.root, 2)
bst.root = bst.insert(bst.root, 4)
bst.root = bst.insert(bst.root, 3)
bst.root = bst.insert(bst.root, 1)