二叉排序树的创建、查找

给定一个数组,将该数组转化成二叉排序树

#include <iostream> 
using namespace std;  

struct BiTNode{
 int data;
 struct BiTNode *lchild, *rchild;//左右孩子
};

bool insertBST(BiTNode *&T,int element)
{
    if(T==NULL)
    {
        T=new BiTNode;
        T->data=element;
        T->lchild=NULL;
        T->rchild=NULL;
        return true;
    }
    else
    {
        if(T->data==element)//如果有相等的元素,则不插进去
            return false;
        else if(T->data<element)
            return insertBST(T->rchild,element);
        else
            return insertBST(T->lchild,element);
    }
}
void createBST(BiTNode *&T,int *a,int n)
{
    //T=NULL;
    for(int i=0;i<n;i++)
        insertBST(T,a[i]);//可以对insertBST的返回值进行判断,若为false,则直接退出createBST函数,表示插入失败
}
bool searchBST(BiTNode *&T,int key)
{
    if(T==NULL)
        return false;
    else
    {
        if(key==T->data)
            return true;
        else if(key<T->data)
            return searchBST(T->lchild,key);
        else
            return searchBST(T->rchild,key);
    }
}
/**************二叉排序树的删除操作***************/
bool Delete(BiTNode *&p)//删除节点p
{
    BiTNode *q,*s;

    if(p->rchild==NULL)//若右子树为空,则只需要重接它的左子树
    {
        q=p;
        p=p->lchild;
        delete q;
    }
    else if(p->lchild==NULL)//若左子树为空
    {
        q=p;
        p=p->rchild;
        delete q;
    }
    else//左右子树均不为空
    {
        q=p;
        s=p->lchild;
        while(s->rchild)
        {
            q=s;
            s=s->rchild;
        }
        p->data=s->data;//s指向被删除节点的直接前驱
        if(q!=p)
            q->rchild=s->lchild;//重接s的右子树
        else
            q->lchild=s->lchild;//重接s的左子树
        delete s;
    }
    return true;
}
bool DeleteBST(BiTNode *&T,int key)
{
    if(T==NULL)
        return false;
    else
    {
        if(key==T->data)
            return Delete(T);
        else if(key<T->data)
            return DeleteBST(T->lchild,key);
        else
            return DeleteBST(T->rchild,key);
    }
}
// 先序遍历 
void preOrderTraverse(BiTNode* T)  
{  
    if(T)  
    {  
        cout << T->data << " ";  
        preOrderTraverse(T->lchild);  
        preOrderTraverse(T->rchild);  
    }  
}  

// 中序遍历 
void inOrderTraverse(BiTNode* T)  
{  
    if(T)  
    {  
        inOrderTraverse(T->lchild);  
        cout << T->data << " ";  
        inOrderTraverse(T->rchild);  
    }  
}  

int main()
{
    BiTNode *T=NULL;
    int a[10] = {4, 5, 2, 1, 0, 9, 3, 7, 6, 8};  
    int n = 10; 
    // 并非所有的a[]都能构造出BST,所以,最好对createBST的返回值进行判断 
    createBST(T, a, n);  

    preOrderTraverse(T);  
    cout << endl;  

    inOrderTraverse(T);  
    cout << endl;  

    cout<<searchBST(T,6);

    DeleteBST(T,5);//删除元素值为5的节点
    inOrderTraverse(T);  
    cout << endl;

    return 0; 
}

结果如图:
《二叉排序树的创建、查找》
第3行输出的数据有问题呀,第一个元素应该是0 ,但是输出的确实10,还没有找到错误的原因

    原文作者:二叉查找树
    原文地址: https://blog.csdn.net/ldw662523/article/details/79430180
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞