美文网首页
二叉查找树

二叉查找树

作者: 海铭威_38cf | 来源:发表于2018-06-15 11:16 被阅读0次

定义

二叉就是每个节点最多有两个孩子节点,并且左子树的结点值小于根节点,右子树的结点值大于根节点,左右子树分别为二叉查找树。
下面就是一个简单的二叉查找树:


查找

查找的步骤:

  • 比较查找值与根节点值
  • 小于根节点,则查找左子树
  • 大于根节点,则查找右子树

比如在下面的二叉查找树中查找9的过程:


插入

插入跟查找的过程很相似,利用查找的步骤找到要插入的位置,插入的位置肯定为叶子节点。
例如在下面的二叉查找树中插入30的过程:


删除

删除节点分为三种情况,下面详细介绍一下每种情况下的处理过程。

没有子节点

这种情况下,可以直接删除节点。
例如在下面的二叉查找树中删除1节点:


只有一个子节点的情况

只有左节点或者只有右节点的情况下,用左/右节点替换掉要删除的节点。
例如在下面的二叉查找树中删除20对应节点:


有两个子节点的情况

有两个子节点的时候,分两步:

  • 找到右子树中最小的节点,用找到的节点替换掉要删除的节点
  • 删除找到的节点

例如在下面的二叉查找树中删除3对应的节点:



代码实现

import reprlib

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

    def __repr__(self):
        return 'Node(%s)' % reprlib.repr(self.value)

class BinarySearchTree:
    def __init__(self):
        self.root = None

    def search(self, value):
        return self._search(self.root, value) is not None

    def _search(self, node, value):
        if node is None:
            return None
        elif node.value == value:
            return node
        elif value > node.value:
            return self._search(node.right, value)
        else:
            return self._search(node.left, value)

    def delete(self, value):
        self.root = self._delete(self.root, value)

    def _delete(self, node, value):
        if node is None:
            print("No node to delete.")
        elif node.value > value:
            node.left = self._delete(node.left, value)
        elif node.value < value:
            node.right = self._delete(node.right, value)
        elif node.value == value:
            if node.left is None and node.right is None:
                node = None
            elif node.left is not None and node.right is not None:
                minnode = self.findmin(node.right)
                node.value = minnode.value
                node.right = self._delete(node.right, minnode.value)
            elif node.left is not None:
                node = node.left
            else:
                node = node.right

        return node

    def findmin(self, node):
        if node is None:
            return None
        elif node.left is None:
            return node
        else:
            return self.findmin(node.left)

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

    def _insert(self, node, value):
        if node is None:
            node = Node(value)
        elif value > node.value:
            node.right = self._insert(node.right, value)
        elif value < node.value:
            node.left = self._insert(node.left, value)
        else:
            print("The node is exist!")

        return node

bst = BinarySearchTree()
bst.insert(10)
bst.insert(3)
bst.insert(20)
bst.insert(1)
bst.insert(7)
bst.insert(25)
bst.insert(5)
bst.insert(9)
bst.insert(23)
print(bst.search(9))
bst.delete(9)

遍历

树存在三种遍历方式,这些遍历方式都是针对根节点来说的:

  • 前序遍历:根节点→左子树→右子树
  • 中序遍历:左子树→根节点→右子树
  • 后序遍历:左子树→右子树→根节点

相关文章

  • 极客时间数据结构与算法之美笔记25~26

    二叉树到二叉查找树,是为了查找数据的效率接近logN。 二叉查找树到平衡二叉查找树,是为了防止二叉查找树沦为链表。...

  • 二叉查找树

    1)二叉查找树是什么?2)二叉查找树的插入、删除、查找?3)Go代码实现 一、二叉查找树是什么?二叉查找树(BST...

  • 红黑树

    红黑树的本质就是一棵二叉查找树,所以先从二叉查找树来了解起。 二叉查找树 二叉查找树又称有序二叉树,具有以下特性:...

  • 二叉查找树

    二叉查找树,又称二叉搜索树 二叉查找树也称为有序二叉查找树,满足二叉查找树的一般性质,是指一棵空树具有如下性质: ...

  • 99-数据结构和算法

    难点:二叉树的遍历 红黑树 图的遍历 二叉查找树二叉查找树(binary search tree),二叉查找树在二...

  • 11-二叉查找树

    二叉查找树 1.什么是二叉查找树? 二叉查找树是一种支持数据动态的插入,删除,查找的数据结构。 2.二叉查找树的设...

  • 17张图带你解析红黑树的原理!保证你能看懂!

    二叉查找树 由于红黑树本质上就是一棵二叉查找树,所以在了解红黑树之前,咱们先来看下二叉查找树。 二叉查找树(Bin...

  • 二叉树 堆 2019-04-17

    二叉树 实现一个二叉查找树,并且支持插入、删除、查找操作 实现查找二叉查找树中某个节点的后继、前驱节点 实现二叉树...

  • 6. 二叉树创建-查找

    1. 递归方式实现二叉树的构建2. 树、二叉树、二叉查找树3. 二叉树排序树的理解4. 二叉查找树5. 二叉树的查找

  • 数据结构中的各种树

    一、二叉树 二、二叉查找树(又称二叉排序树,二叉搜索树) 二叉查找树(Binary Search Tree)它或者...

网友评论

      本文标题:二叉查找树

      本文链接:https://www.haomeiwen.com/subject/xrrpeftx.html