定义:
二叉查找树是一种二叉树数据结构,其任意节点的值大于其左子树所有节点,且小于右子树所有节点。支持多种动态集合上的操作,主要有查找、最大值、最小值、前驱、后继、插入和删除,这些操作都可以在O(n )时间复杂度内完成,其中n为二叉树的高度。
操作:
查找:从根节点开始搜索,若查找值等于根节点值,则命中,若小于根节点值,则递归搜索左子树,否则递归搜索右子树;
最大值:查找二叉树最右侧的节点;
最小值:查找二叉树最左侧的节点;
前驱:若查询节点左子树不为空,则前驱为左子树的最大值,若左子树为空,则前驱为小于查询节点的最低祖先节点;
后继:若查询节点右子树不为空,则后继为右子树的最小值,若右子树为空,则后继为大于查询节点的最低祖先节点;
插入:从根节点开始搜索,若根节点为空,则插入当前值,若当前值不大于根节点值,则递归搜索左子树,否则递归搜索右子树;
删除:删除在二叉树操作比较麻烦,因为删除节点后会破坏二叉树,要设法恢复。若删除节点左子树右子树都为空,则直接删除节点。若删除节点只有左子树为空或只有右子树为空,节点子树链接到节点父节点,然后删除节点。若删除节点左子树右子树都不为空,则搜索节点的后继节点,将后继节点值移当前节点。
随机构造的二叉树期望高度为lg(n),所以期望时间复杂度为O(lg(n)),但理论上最坏时间复杂度可能会达到O(n)。所以实际应用中为了达到稳定的时间复杂度O(lgn),都会构造平衡的二叉树,可以保证在最坏的情况下,操作的时间复杂度也为O(lg(n))。