首页 > 其他 > 详细

BST的前驱和后继

时间:2020-03-13 17:41:05      阅读:63      评论:0      收藏:0      [点我收藏+]

BST  中序遍历是 从小到大排序的

1.查找后继(找第一个比他大的数)  

     根据BST的 左小右大性质

    1.若该节点有右孩子,则找  该右子数的最下值

              2.如该节点无右孩子,    不断寻找祖先P1  如果P1的父节点G1 且G1.letfChild =P1 则找到了第一个比他大的数 若无则为空

         技术分享图片

 

 

  

 

     代码:   

    @Override
    public K successor(K x) {
        BSTNode<K, V> xNode = lookupNode(x);
        if (xNode==null) return null;
        if (xNode.right!=null){//1.有右孩子 找右字数中的最小值
              return  minNode(xNode.right).key;
        }
        //2.无右孩子  斜线的拐角  也就是是第一个比当前节点大的节点
        BSTNode<K, V> fNode = xNode.parent;
        while (fNode!=null&&xNode==fNode.right){
            xNode=fNode;
            fNode=fNode.parent;
        }
        //找到根  或者找到了  右斜线的拐角  也就是是第一个比当前节点key大的节点
        return  fNode==null?null:fNode.key;
    }    

 2.查找前驱 (找一个第一个比他小的)

      1.有左孩子   则在左子树中找一个最大值

      2.无左孩子    不断寻找祖先P1  如果P1的父节点G1 且G1.letfChild =P1 则找到了第一个比他大的数 若无则为空

代码:

   //找一个比它小的
    @Override
    public K predecessor(K x) {
        BSTNode<K, V> xNode = lookupNode(x);
        if (xNode==null) return null;
        if (xNode.left!=null){ //有左孩子  找到该节点左子树的最大节点值
            return  maxNode(xNode.left).key;
        }
        BSTNode<K,V> fNode =xNode.parent;
        // 做斜线找到第一个左拐角
        while (fNode!=null &&fNode.left==xNode){
            xNode=fNode;
            fNode=fNode.parent;

        }
        return fNode==null?null:fNode.key;
    }

  

 

BST的前驱和后继

原文:https://www.cnblogs.com/Dr-d/p/12487583.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!