二叉搜索树c/c++代码实现

包含了二叉搜索树的插入,删除,查找,中序遍历,找最大值最小值的操作,代码中有注释。

/*Keep on going Never give up*/
//#pragma GCC optimize(3,"Ofast","inline")
#include <bits/stdc++.h>
using namespace std;
struct Node{
    int data;
    Node *l,*r,*parent;
};

//由大到小排序(中序遍历二叉树)
void sortx(Node *rt){
    if(rt==NULL) return;
    sortx(rt->l);
    cout<<rt->data<<endl;
    sortx(rt->r);
}

//插入结点
Node* insert(Node* rt,int val){
    if(!rt){   //若原树为空,生成并返回一个结点的二叉搜索树
        rt=new Node;
        rt->data=val;
        rt->r=rt->l=NULL;
    } else{     //开始找要插入元素的位置
        if(val<rt->data)  rt->l=insert(rt->l,val);  //递归左子树
        else if(val>rt->data)   rt->r=insert(rt->r,val);       //递归右子树
    }
    return rt;
}
//找出val的结点
Node* ifind(Node *rt,int val){
    while (rt!=NULL&&rt->data!=val){
        if(val<rt->data) rt=rt->l;
        else rt=rt->r;
    }
    return rt;
}
//找出最大值
Node* imax(Node *rt){
    while (rt->r!=NULL) rt=rt->r;
    return rt;
}
//找出最小值
Node* imin(Node *rt){
    while (rt->l!=NULL) rt=rt->l;
    return rt;
}
//删除给定结点
Node* del(Node *rt,int val){
    Node *temp=new Node;
    if(!rt) cout<<"元素未找到"<<endl;
    else{
        if(val<rt->data) rt->l=del(rt->l,val);  /* 从左子树递归删除 */
        else if(val>rt->data) rt->r=del(rt->r,val);/* 从右子树递归删除 */
        else{
            if(rt->l&&rt->r){   //分情况删除
                temp=imin(rt->r);
                rt->data=temp->data;
                rt->r=del(rt->r,rt->data);
            } else{
                temp=rt;
                if(!rt->l) rt=rt->r;
                else rt=rt->l;
            }
            free(temp);
        }
    }
    return rt;
}
int main()
{
    int a[10]={5,6,8,2,3,7,4,1,5,77};
    Node *root=NULL;
    for(int i=0;i<10;i++) root=insert(root,a[i]);
    root=del(root,7);
    sortx(root);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/xxxxxiao123/article/details/107037307