二叉查找树

二叉查找树

二叉查找树(二叉排序树)

  • 对于树中每个节点X,它的左子树所有节点的值均小于X中的值,它的右子树所有节点的值均大于X中的值。

二叉查找树的查找

//查找成功,返回true,否则p指向查找路径上最后访问的节点并返回false
Status searchBST(BiTree T, KeyType key, BiTree &p) {
        //树空
        if(!T) {p = NULL; return false;}
        else if(EQ(key, T -> data.key))
            //在左子树中继续查找
            return searchBSRT(T -> lchild, key ,p);
        else if(LT(key, t -> data.key))
            //在右子树中查找
            return searchBSRT(T -> rchild, key ,p);
    }

二叉查找树的插入

Status insertBST(BiTree T, Element e){
    //当二叉树中不存在e.key时,插入e并返回true
    if(!searchBST(T, e.key, p)){
        s = (BiTree)malloc(sizeof(BiTree));
        s -> data = e;
        s -> lchild = s -> rchild = NULL;
        //树空
        if(!p) T = s;
        else if(LT(e.key, p -> data.key))
            //被插节点为*s左孩子
            p -> lchild = s;
        else
            p -> rchild = s;
        return TRUE;
    }
    return FALSE;
    
}

二叉查找树的删除

二叉查找树删除节点T的一般策略是:用其左子树的最大节点S的数据代替T节点的数据,并递归的删除该最大节点S。

  • 当用S代替T,S由于是T的左子树的节点,必然小于T的右子树,符合二叉查找树特征之一
    接下来就是处理左子树的顺序问题
  • 由于删除的S是T的左子树的最大节点,故该节点没有右子树,S只存在或不存在左子树,
    若存在左子树(删除S后,该左子树成为T的左子树的最大子树),只需将其接在S的直接前驱节点上即可。
Status deleteBST(BiTree &T, KeyType key){
    //空树
    if(!T) return false;
    else {
            //找到该元素,将其删除
            if(EQ(key, T -> data.kay)) return delete(T);
        else
            //递归的左子树中查找
            if(LT(key, t -> data.key)) return deleteBST(T -> lchild, key);
        else
            //递归的左子树中查找
            return deleteBST(T -> rchild, key);
    }
}

//删除节点p,并重接其左右子树
Status delete(BiTree &P){
    //右子树为空,只需重接其左子树即可
    if(!p -> rchild){
        q = p;
        p = p -> lchild;
        free(q);
    } else if(!p => lchild){
        //左子树为空,只需重接其右子树即可
        q = p;
        p = p -> rchild;
        free(p);
    } else {
        左右子树均不空,找到T的左子树的最大节点S
        q = p;
        //转到p的左子树根节点
        s = p -> lchild;
        //向右,走到尽头,q始终为S的直接前驱
        while(s -> rchild){
            q = s;
            s = s -> rchild;
        }
        //用S代替T
        p -> data = s -> data;

        if(q != p) 
            q -> rchild = s -> lchild;
        else
        //p == q说明T的左子树只有一个根节点
            q -> lchild = s -> lchild;
        
        delete s;

    }
    return TRUE;
}

你可能感兴趣的:(二叉查找树)