算法与数据结构(20)—— 二叉搜索树中的ceil、floor方法以及总结

寻找floor , ceil无需保证。
  • 若key值存在,那么floor , ceil就是key值自身。
  • 若key值不存在:
    • floor:是最接近key值且**小于**key的节点
    • ceil:是最接近key值且**大于**key的节点

例如下图,举几个例子来了解:

  • 节点41的floor , ceil是41;
  • 45的floor是42,ceil是50;
  • 64无ceil,floor是61;
  • 11无floor,ceil是13。

这里写图片描述

(2)代码实现

这里寻找floor 或 ceil 的逻辑主要分为3个步骤(这里只列出寻找floor 的步骤,ceil 同理,在此不赘述):

  • 如果node的key值和要寻找的key值相等:则node本身就是key的floor节点。
  • 如果node的key值比要寻找的key值大:则要寻找的key的floor节点一定在node的左子树中。
  • 如果node的key值比要寻找的key值小:则node有可能是key的floor节点, 也有可能不是(存在比node->key大但是小于key的其余节点),需要尝试向node的右子树寻找一下。

以floor实现为例:

public Key floor(Key key){

        if( count == 0 || key.compareTo(minimun()) < 0 )
            return null;

        Node floorNode = floor(root, key);
        return floorNode.key;
    }


private Node floor(Node node, Key key){

        if(node == null) return null;

        //如果该node的key和key相等,就是本身
        if(node.key.compareTo(key) == 0){
            return node;
        }

        //如果该node比key要大的话
        if(node.key.compareTo(key) > 0){
            return floor(node.left, key);
        }

        //如果node比key小,可能是,也能是不是
        Node tempNode = floor(node.right, key);
        if(tempNode != null)  return tempNode;
        return node;   //想当于 tempNode == null
    }


总结:

    局限性:二分搜索树可能退化成链表,实际操作中还是有左孩子的概念,只不过一直是判断时空的情况,二分搜索树的查找过程与高度相关,此高度为n,时间复杂度O(n^2),但是如果要保证高度是logn级别的,无法退化成链表,经典实现就是红黑树,是一颗平衡二叉树,左右子树高度差不超过1~

树形问题:

        尽管没有一棵树,但是会用到树结构,这种结构有天然的递归性质

1. 排序问题

(1)归并排序

例如之前讲解排序算法中的归并排序,回忆其重点,将数组逐渐分成两个部分,分别排序,再逐渐归并起来。这整个过程归纳起来就是一棵树的情况,虽然在解决问题时并未创建树结构。

这里写图片描述

(2)快速排序

同理,快速排序中找到数组的标志点将其一分为二,在子数组中继续找到标志点再将其一份为二。其过程都是对数的一次遍历,类似于后序遍历或前序遍历。

这里写图片描述

2. 搜索问题

递归方式对于搜索问题更是尤为重要!事实上,绝大部分计算机问题都可以使用搜索方式解决。

一条龙游戏,八皇后,数独


猜你喜欢

转载自blog.csdn.net/jae_wang/article/details/80625827
今日推荐