二叉搜索树定义

  1. 二叉搜索树是一个二叉树
  2. 二叉搜索树中的任意节点都包含3个指针,分别指向该节点的父节点和左右孩子节点。
  3. 对于二叉搜索树中的任意节点,该节点的值大于等于非空左子树中任意节点的值且小于等于非空右子树中任意节点的值。

插入节点

如果插入值小于当前节点这进入左子树(如果左子树为空则把插入节点作为单前节点的左子树,插入完成),如果插入值大于等于当前节点则进入右子树(如果右子树为空则把插入节点作为单前节点的右子树,插入完成)。

二叉搜索树 Python 二叉搜索树的定义_二叉搜索树

删除节点

从一棵二叉搜索树删除一个结点分为三种基本情况:

  1. 如果该节点没有孩子结点,那么只是简单地将它删除,并修改它的父结点。
  2. 如果该节点只有一个孩子结点,那么将这个孩子提升到树中该节点的位置上。
  3. 如果该节点有两个孩子结点,那么找该节点的后继(大于该节点值的最小节点,也就是该节点右子树中的最小节点),并让后继占据树中该节点的位置。

总结 

二叉查找树的效率和树的深度d有关,为O(d)。而二叉查找树容易退化成链表,也就是说二叉查找树最坏情况下时间复杂度是O(n)

 

python实现

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

    def insert(self, root, val):
        if root == None:
            root = BST(val)
        elif val < root.val:
            root.left = self.insert(root.left, val)
        else:
            root.right = self.insert(root.right, val)
        return root

    def query(self, root, val):
        if root == None:
            return False;
        elif root.val == val:
            return True
        elif val < root.val:
            return self.query(root.left, val)
        else:
            return self.query(root.right, val)

    def delNode(self, root, val):
        if root == None:
            return
        if val < root.val:
            root.left = self.delNode(root.left, val)
        elif val > root.val:
            root.right = self.delNode(root.right, val)
        else:
            if root.left == None and root.left == None:
                root = None
            elif root.left != None and root.right == None:
                root = root.left
            elif root.left == None and root.right != None:
                root = root.right
            elif root.left != None and root.right != None:
                temp = self.findMin(root.right)
                root.val = temp.val
                root.right = self.delNode(root.right, temp.val)
        return root

    def findMin(self, root):
        if root.left != None:
            return self.findMin(root.left)
        else:
            return root

    def printTree(self, root):
        if root != None:
            self.printTree(root.left)
            print(root.val, end = ' ')
            self.printTree(root.right)