二叉排序树的查找,插入

//二叉排序树的查找
BiTree search(BiTree T,int key){
    if(T == NULL)                //递归出口
        return NULL;
    if(T->data == key)            //递归出口
        return T->data;
    else if(key < T->data)
        search(T->lchild,key);
    else
        search(T->rchild,key);
}

//二叉排序树插入的递归算法
//算法思想:
//1.T->data = k; 插入失败
//2.k > T->data,在T的右子树找;    k < T->data,在T的左子树找;
//  当在一个结点上找到T == NULL时;把k插入进去,return 1;插入成功

int BST_Insert(BiTree &T,Keytype k){
    if(T == NULL){            //为空,插入
        T = (BiTree)malloc(sizeof(BiTreeNode));
        T->data = k;
        T->lchild = NULL;
        T->rchild = NULL;
        return 1;                //插入成功
    }
    else if(k < T->data)
        BST_Insert(T->lchild,k);
    else if(k > T->data)
        BST_Insert(T->rchild,k);
    else 
        return 0;

}

//二叉排序树非递归算法
//算法思想:
//1.若T刚开始为空,则直接创建结点插入
//2.若T不为空。比较T->data 与 key的大小
//  if key < T->data,往左找
//  if key > T->data,往右找
//  直到找到一个结点的data为NULL,把key插入到这个结点
//但是在插入这个结点之前,要拿到这个结点的父亲结点,所以要设置一个preT
//然后用tag 的值来判断到底是在preT的左孩子还是右孩子

int BST_Insert(BiTree &T,int key){
    if(T == NULL){                    //如果根节点为空,直接插入
        T = (BiTree)malloc(sizeof(BiTreeNode));
        T->data = key;
        T->lchild = T->rchild = NULL;
        return 1;
    }
    BiTree preT;
    int tag;                       //用于当T为NULL时,根据tag的值判断是左边来的还是右边来的
    while(T != NULL){                //如果根节点不为空
        if(key < T->data){            //关键字小于根节点值,在左边找,tag改成0
            preT = T;
            tag = 0;
            T = T->lchild;
        }else if(key > T->data){        //关键字小于根节点值,在右边找,tag改成1
            preT = T;
            tag = 1;
            T = T->rchild;
        }
        else                            //关键字与根节点值相等,插入失败
            return 0;
    }
    BiTree k = (BiTree)malloc(sizeof(BiTreeNode));
    k->data = key;
    k->lchild = k->rchild = NULL;
    if(tag == 0)
        preT->lchild = k;            //将k接到preT的左边
    else
        preT->rchild = k;            //将k接到preT的右边
    return 1;                        //插入成功
}


//二叉排序树的构造:

void Creat_BST(BiTree &T,int str[],int n){
    T = NULL;
    int i = 0;
    while(i<n){
        BST_Insert(T,str[i]);
        i++;
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值