zoukankan      html  css  js  c++  java
  • binary search tree

    它写的很好一点,就是大小写分的很清,我经常都是一边写。这个位置就要学习下。代码抽空看看。官网的二分源码。还是值得学习的。多学习下优秀的代码。

          if key < node.key:
                return self._get(key, node.left)
            elif key > node.key:
                return self._get(key, node.right)
            else:
                return node.val

    而且都是在前面定义 了属性,再定义方法。把这两者分开。我就没有,我不确定,因为前面都是_get , 后面才又跟着一个get。

    构造函数用单一的前置下划线(_)来创建属性。属性名以单下划线开头。虽然在python语法中没有特殊的含义,但单下划线是python程序员使用类是约定的使用的符号,表明程序员不希望类的用户直接访问属性。如果程序要求访问属性,程序员会提供其他途径

    """
        Binary Search Tree
        ------------------
        The Binary Search Tree represents an ordered symbol table of generic
        key-value pairs.  Keys must be comparable.  Does not permit duplicate keys.
        When assocating a value with a key already present in the BST, the previous
        value is replaced by the new one.  This implementation is for an unbalanced
        BST.
    
        Pseudo Code: http://algs4.cs.princeton.edu/32bst
    """
    
    
    [docs]class Node(object):
        """
        Implementation of a Node in a Binary Search Tree.
        """
    
        def __init__(self, key=None, val=None, size_of_subtree=1):
            self.key = key
            self.val = val
            self.size_of_subtree = size_of_subtree
            self.left = None
            self.right = None
    
    
    [docs]class BinarySearchTree(object):
        """
        Implementation of a Binary Search Tree.
        """
    
        def __init__(self):
            self.root = None
    
        def _size(self, node):
            if node is None:
                return 0
            else:
                return node.size_of_subtree
    
    [docs]    def size(self):
            """
            Return the number of nodes in the BST
    
            Worst Case Complexity: O(1)
    
            Balanced Tree Complexity: O(1)
            """
            return self._size(self.root)
    
    [docs]    def is_empty(self):
            """
            Returns True if the BST is empty, False otherwise
    
            Worst Case Complexity: O(1)
    
            Balanced Tree Complexity: O(1)
            """
            return self.size() == 0
    
        def _get(self, key, node):
            if node is None:
                return None
    
            if key < node.key:
                return self._get(key, node.left)
            elif key > node.key:
                return self._get(key, node.right)
            else:
                return node.val
    
    [docs]    def get(self, key):
            """
            Return the value paired with 'key'
    
            Worst Case Complexity: O(N)
    
            Balanced Tree Complexity: O(lg N)
            """
            return self._get(key, self.root)
    
    [docs]    def contains(self, key):
            """
            Returns True if the BST contains 'key', False otherwise
    
            Worst Case Complexity: O(N)
    
            Balanced Tree Complexity: O(lg N)
            """
            return self.get(key) is not None
    
        def _put(self, key, val, node):
    
            # If we hit the end of a branch, create a new node
            if node is None:
                return Node(key, val)
    
            # Follow left branch
            if key < node.key:
                node.left = self._put(key, val, node.left)
            # Follow right branch
            elif key > node.key:
                node.right = self._put(key, val, node.right)
            # Overwrite value
            else:
                node.val = val
    
            node.size_of_subtree = self._size(node.left) + self._size(node.right)+1
            return node
    
    [docs]    def put(self, key, val):
            """
            Add a new key-value pair.
    
            Worst Case Complexity: O(N)
    
            Balanced Tree Complexity: O(lg N)
            """
            self.root = self._put(key, val, self.root)
    
        def _min_node(self):
            """
            Return the node with the minimum key in the BST
            """
            min_node = self.root
            # Return none if empty BST
            if min_node is None:
                return None
    
            while min_node.left is not None:
                min_node = min_node.left
    
            return min_node
    
    [docs]    def min_key(self):
            """
            Return the minimum key in the BST
    
            Worst Case Complexity: O(N)
    
            Balanced Tree Complexity: O(lg N)
            """
            min_node = self._min_node()
            if min_node is None:
                return None
            else:
                return min_node.key
    
        def _max_node(self):
            """
            Return the node with the maximum key in the BST
            """
            max_node = self.root
            # Return none if empty BST
            if max_node is None:
                return None
    
            while max_node.right is not None:
                max_node = max_node.right
    
            return max_node
    
    [docs]    def max_key(self):
            """
            Return the maximum key in the BST
    
            Worst Case Complexity: O(N)
    
            Balanced Tree Complexity: O(lg N)
            """
            max_node = self._max_node()
            if max_node is None:
                return None
            else:
                return max_node.key
    
        def _floor_node(self, key, node):
            """
            Returns the node with the biggest key that is less than or equal to the
            given value 'key'
            """
            if node is None:
                return None
    
            if key < node.key:
                # Floor must be in left subtree
                return self._floor_node(key, node.left)
    
            elif key > node.key:
                # Floor is either in right subtree or is this node
                attempt_in_right = self._floor_node(key, node.right)
                if attempt_in_right is None:
                    return node
                else:
                    return attempt_in_right
    
            else:
                # Keys are equal so floor is node with this key
                return node
    
    [docs]    def floor_key(self, key):
            """
            Returns the biggest key that is less than or equal to the given value
            'key'
    
            Worst Case Complexity: O(N)
    
            Balanced Tree Complexity: O(lg N)
            """
            floor_node = self._floor_node(key, self.root)
            if floor_node is None:
                return None
            else:
                return floor_node.key
    
        def _ceiling_node(self, key, node):
            """
            Returns the node with the smallest key that is greater than or equal to
            the given value 'key'
            """
            if node is None:
                return None
    
            if key < node.key:
                # Ceiling is either in left subtree or is this node
                attempt_in_left = self._ceiling_node(key, node.left)
                if attempt_in_left is None:
                    return node
                else:
                    return attempt_in_left
            elif key > node.key:
                # Ceiling must be in right subtree
                return self._ceiling_node(key, node.right)
            else:
                # Keys are equal so ceiling is node with this key
                return node
    
    [docs]    def ceiling_key(self, key):
            """
            Returns the smallest key that is greater than or equal to the given
            value 'key'
    
            Worst Case Complexity: O(N)
    
            Balanced Tree Complexity: O(lg N)
            """
            ceiling_node = self._ceiling_node(key, self.root)
            if ceiling_node is None:
                return None
            else:
                return ceiling_node.key
    
        def _select_node(self, rank, node):
            """
            Return the node with rank equal to 'rank'
            """
            if node is None:
                return None
    
            left_size = self._size(node.left)
            if left_size < rank:
                return self._select_node(rank - left_size - 1, node.right)
            elif left_size > rank:
                return self._select_node(rank, node.left)
            else:
                return node
    
    [docs]    def select_key(self, rank):
            """
            Return the key with rank equal to 'rank'
    
            Worst Case Complexity: O(N)
    
            Balanced Tree Complexity: O(lg N)
            """
            select_node = self._select_node(rank, self.root)
            if select_node is None:
                return None
            else:
                return select_node.key
    
        def _rank(self, key, node):
            if node is None:
                return None
    
            if key < node.key:
                return self._rank(key, node.left)
            elif key > node.key:
                return self._size(node.left) + self._rank(key, node.right) + 1
    
            else:
                return self._size(node.left)
    
    [docs]    def rank(self, key):
            """
            Return the number of keys less than a given 'key'.
    
            Worst Case Complexity: O(N)
    
            Balanced Tree Complexity: O(lg N)
            """
            return self._rank(key, self.root)
    
        def _delete(self, key, node):
            if node is None:
                return None
            if key < node.key:
                node.left = self._delete(key, node.left)
            elif key > node.key:
                node.right = self._delete(key, node.right)
    
            else:
                if node.right is None:
                    return node.left
                elif node.left is None:
                    return node.right
                else:
                    old_node = node
                    node = self._ceiling_node(key, node.right)
                    node.right = self._delete_min(old_node.right)
                    node.left = old_node.left
            node.size_of_subtree = self._size(node.left) + self._size(node.right)+1
            return node
    
    [docs]    def delete(self, key):
            """
            Remove the node with key equal to 'key'
    
            Worst Case Complexity: O(N)
    
            Balanced Tree Complexity: O(lg N)
            """
            self.root = self._delete(key, self.root)
    
        def _delete_min(self, node):
            if node.left is None:
                return node.right
    
            node.left = self._delete_min(node.left)
            node.size_of_subtree = self._size(node.left) + self._size(node.right)+1
            return node
    
    [docs]    def delete_min(self):
            """
            Remove the key-value pair with the smallest key.
    
    
            Worst Case Complexity: O(N)
    
            Balanced Tree Complexity: O(lg N)
            """
            self.root = self._delete_min(self.root)
    
        def _delete_max(self, node):
            if node.right is None:
                return node.left
    
            node.right = self._delete_max(node.right)
            node.size_of_subtree = self._size(node.left) + self._size(node.right)+1
            return node
    
    [docs]    def delete_max(self):
            """
            Remove the key-value pair with the largest key.
    
            Worst Case Complexity: O(N)
    
            Balanced Tree Complexity: O(lg N)
            """
            self.root = self._delete_max(self.root)
    
        def _keys(self, node, keys):
            if node is None:
                return keys
    
            if node.left is not None:
                keys = self._keys(node.left, keys)
    
            keys.append(node.key)
    
            if node.right is not None:
                keys = self._keys(node.right, keys)
    
            return keys
    
    [docs]    def keys(self):
            """
            Return all of the keys in the BST in aschending order
    
            Worst Case Complexity: O(N)
    
            Balanced Tree Complexity: O(N)
            """
            keys = []
            return self._keys(self.root, keys)
  • 相关阅读:
    ES6躬行记(6)——Symbol
    ES6躬行记(5)——对象字面量的扩展
    ES6躬行记(4)——模板字面量
    ES6躬行记(3)——解构
    ES6躬行记(2)——扩展运算符和剩余参数
    构建LINUX下的入侵检测系统——LIDS 系统管理命令--vlock
    Linux就这个范儿 第15章 七种武器 linux 同步IO: sync、fsync与fdatasync Linux中的内存大页面huge page/large page David Cutler Linux读写内存数据的三种方式
    高性能Linux服务器 第11章 构建高可用的LVS负载均衡集群
    Linux就这个范儿 第14章 身在江湖
    Linux就这个范儿 第13章 打通任督二脉
  • 原文地址:https://www.cnblogs.com/sakura3/p/8433869.html
Copyright © 2011-2022 走看看