递归插入仅插入第一个元素python bst

时间:2018-11-15 00:02:57

标签: python

我正在尝试实现bst的插入功能,但是我的递归方法仅插入第一个值。我的方法是遍历直到空孩子,然后将该节点设置为新值。

class BSTNode(object):
    def __init__(self, val):
        self.val = val
        self.left = None
        self.right = None

def insert(self, val):
    if self.root is None:
        self.root = BSTNode(val)
    else:
        self.insertNode(self.root,val)

def insertNode(self,node, val):
    if node is None:
        node = BSTNode(val)
        return 
    elif val <= node.val:
        node.left = self.insertNode(node.left, val)
    elif val > node.val:
        node.right = self.insertNode(node.right, val)

bst = new BST()
bst.insert(5)
bst.insert(10)

2 个答案:

答案 0 :(得分:2)

您不会在BSTNode中返回insertNode(因此您创建了一个节点,但返回了None)。您应该改为:

if node is None:
    return BSTNode(val)

因此完整方法变为:

def insertNode(self, node, val):
    if node is None:
        return BSTNode(val)
    elif val <= node.val:
        node.left = self.insertNode(node.left, val)
    elif val > node.val:
        node.right = self.insertNode(node.right, val)
    return node

答案 1 :(得分:1)

首先创建一个节点类可能会有所帮助...单独考虑一个节点比考虑一棵树要容易。

class Node:
   def __init__(self,value):
       self.value = value
       self.left = None
       self.right = None
   def insert_value(self,value):
       # there are 3 cases
       if not self.value: # in one case this node has no value
           self.value = value
       elif value < self.value: # if value is less than this nodes value
           # then insert it to the left
           if not self.left:
               self.left = Node(value)
           else:
               self.left.insert_value(value)
       else: # otherwise if value is greater than or equal to this nodes value
           # then insert it to the right
           if not self.right:
               self.right = Node(value)
           else:
               self.right.insert_value(value)

一旦有了这个Node类,树的实现就变得微不足道了。

class BST:
    def __init__(self,root_value=None):
        self.root = Node(root_value)
    def insert_value(self,value):
        self.root.insert_value(value)

bst = BST()
bst.insert_value(5)
bst.insert_value(10)
print(bst.root)

现在,您当然不必以这种方式解决此问题了……但是(至少对我来说)它使推理变得更容易。