How to implement a binary search tree in Python?

前端 未结 18 2019
眼角桃花
眼角桃花 2020-11-30 22:25

This is what I\'ve got so far but it is not working:

class Node:
    rChild,lChild,data = None,None,None

    def __init__(self,key):
        self.rChild = N         


        
相关标签:
18条回答
  • 2020-11-30 23:06

    A simple, recursive method with only 1 function and using an array of values:

    class TreeNode(object):
    
        def __init__(self, value: int, left=None, right=None):
            super().__init__()
            self.value = value
            self.left = left
            self.right = right
    
        def __str__(self):
            return str(self.value)
    
    
    def create_node(values, lower, upper) -> TreeNode:
        if lower > upper:
            return None
    
        index = (lower + upper) // 2
    
        value = values[index]
        node = TreeNode(value=value)
        node.left = create_node(values, lower, index - 1)
        node.right = create_node(values, index + 1, upper)
    
        return node
    
    
    def print_bst(node: TreeNode):
        if node:
            # Simple pre-order traversal when printing the tree
            print("node: {}".format(node))
            print_bst(node.left)
            print_bst(node.right)
    
    
    
    if __name__ == '__main__':
        vals = [0, 1, 2, 3, 4, 5, 6]
        bst = create_node(vals, lower=0, upper=len(vals) - 1)
        print_bst(bst)
    

    As you can see, we really only need 1 method, which is recursive: create_node. We pass in the full values array in each create_node method call, however, we update the lower and upper index values every time that we make the recursive call.

    Then, using the lower and upper index values, we calculate the index value of the current node and capture it in value. This value is the value for the current node, which we use to create a node.

    From there, we set the values of left and right by recursively calling the function, until we reach the end state of the recursion call when lower is greater than upper.

    Important: we update the value of upper when creating the left side of the tree. Conversely, we update the value of lower when creating the right side of the tree.

    Hopefully this helps!

    0 讨论(0)
  • 2020-11-30 23:09
    class Node:
        rChild,lChild,parent,data = None,None,None,0    
    
    def __init__(self,key):
        self.rChild = None
        self.lChild = None
        self.parent = None
        self.data = key 
    
    class Tree:
        root,size = None,0
        def __init__(self):
            self.root = None
            self.size = 0
        def insert(self,someNumber):
            self.size = self.size+1
            if self.root is None:
                self.root = Node(someNumber)
            else:
                self.insertWithNode(self.root, someNumber)    
    
        def insertWithNode(self,node,someNumber):
            if node.lChild is None and node.rChild is None:#external node
                if someNumber > node.data:
                    newNode = Node(someNumber)
                    node.rChild = newNode
                    newNode.parent = node
                else:
                    newNode = Node(someNumber)
                    node.lChild = newNode
                    newNode.parent = node
            else: #not external
                if someNumber > node.data:
                    if node.rChild is not None:
                        self.insertWithNode(node.rChild, someNumber)
                    else: #if empty node
                        newNode = Node(someNumber)
                        node.rChild = newNode
                        newNode.parent = node 
                else:
                    if node.lChild is not None:
                        self.insertWithNode(node.lChild, someNumber)
                    else:
                        newNode = Node(someNumber)
                        node.lChild = newNode
                        newNode.parent = node                    
    
        def printTree(self,someNode):
            if someNode is None:
                pass
            else:
                self.printTree(someNode.lChild)
                print someNode.data
                self.printTree(someNode.rChild)
    
    def main():  
        t = Tree()
        t.insert(5)  
        t.insert(3)
        t.insert(7)
        t.insert(4)
        t.insert(2)
        t.insert(1)
        t.insert(6)
        t.printTree(t.root)
    
    if __name__ == '__main__':
        main()
    

    My solution.

    0 讨论(0)
  • 2020-11-30 23:11

    Here is a working solution.

    class BST:
        def __init__(self,data):
            self.root = data
            self.left = None
            self.right = None
    
        def insert(self,data):
            if self.root == None:
                self.root = BST(data)
            elif data > self.root:
                if self.right == None:
                    self.right = BST(data)
                else:
                    self.right.insert(data)
            elif data < self.root:
                if self.left == None:
                    self.left = BST(data)
                else:
                    self.left.insert(data)
    
        def inordertraversal(self):
            if self.left != None:
                self.left.inordertraversal()
            print (self.root),
            if self.right != None:
                self.right.inordertraversal()
    
    t = BST(4)
    t.insert(1)
    t.insert(7)
    t.insert(3)
    t.insert(6)
    t.insert(2)
    t.insert(5)
    t.inordertraversal()
    
    0 讨论(0)
  • 2020-11-30 23:11

    The following code is basic on @DTing‘s answer and what I learn from class, which uses a while loop to insert (indicated in the code).

    class Node:
        def __init__(self, val):
            self.l_child = None
            self.r_child = None
            self.data = val
    
    
    def binary_insert(root, node):
        y = None
        x = root
        z = node
        #while loop here
        while x is not None:
            y = x
            if z.data < x.data:
                x = x.l_child
            else:
                x = x.r_child
        z.parent = y
        if y == None:
            root = z
        elif z.data < y.data:
            y.l_child = z
        else:
            y.r_child = z
    
    
    def in_order_print(root):
        if not root:
            return
        in_order_print(root.l_child)
        print(root.data)
        in_order_print(root.r_child)
    
    
    r = Node(3)
    binary_insert(r, Node(7))
    binary_insert(r, Node(1))
    binary_insert(r, Node(5))
    
    in_order_print(r)
    
    0 讨论(0)
  • 2020-11-30 23:14
    class BST:
        def __init__(self, val=None):
            self.left = None
            self.right = None
            self.val = val
    
        def __str__(self):
            return "[%s, %s, %s]" % (self.left, str(self.val), self.right)
    
        def isEmpty(self):
            return self.left == self.right == self.val == None
    
        def insert(self, val):
            if self.isEmpty():
                self.val = val
            elif val < self.val:
                if self.left is None:
                    self.left = BST(val)
                else:
                    self.left.insert(val)
            else:
                if self.right is None:
                    self.right = BST(val)
                else:
                    self.right.insert(val)
    
    a = BST(1)
    a.insert(2)
    a.insert(3)
    a.insert(0)
    print a
    
    0 讨论(0)
  • 2020-11-30 23:15

    Another Python BST with sort key (defaulting to value)

    LEFT = 0
    RIGHT = 1
    VALUE = 2
    SORT_KEY = -1
    
    class BinarySearchTree(object):
    
        def __init__(self, sort_key=None):
            self._root = []  
            self._sort_key = sort_key
            self._len = 0  
    
    def insert(self, val):
        if self._sort_key is None:
            sort_key = val // if no sort key, sort key is value
        else:
            sort_key = self._sort_key(val)
    
        node = self._root
        while node:
            if sort_key < node[_SORT_KEY]:
                node = node[LEFT]
            else:
                node = node[RIGHT]
    
        if sort_key is val:
            node[:] = [[], [], val]
        else:
            node[:] = [[], [], val, sort_key]
        self._len += 1
    
    def minimum(self):
        return self._extreme_node(LEFT)[VALUE]
    
    def maximum(self):
        return self._extreme_node(RIGHT)[VALUE]
    
    def find(self, sort_key):
        return self._find(sort_key)[VALUE]
    
    def _extreme_node(self, side):
        if not self._root:
            raise IndexError('Empty')
        node = self._root
        while node[side]:
            node = node[side]
        return node
    
    def _find(self, sort_key):
        node = self._root
        while node:
            node_key = node[SORT_KEY]
            if sort_key < node_key:
                node = node[LEFT]
            elif sort_key > node_key:
                node = node[RIGHT]
            else:
                return node
        raise KeyError("%r not found" % sort_key)
    
    0 讨论(0)
提交回复
热议问题