数据结构——链式二叉树

来源:互联网 发布:大数据分析课程 编辑:程序博客网 时间:2024/06/05 10:06
#include <iostream>using namespace std;typedef struct treenode{    struct treenode *left;    char data;    struct treenode *right;}Treenode,* Treep;//初始化二叉树void init_tree(Treep &root){    root=NULL;    cout<<"初始化成功!"<<endl;}//创建二叉树void creat_tree(Treep &rt){    char ch;    ch=getchar();    if('#'==ch)        rt=NULL;    else    {        rt=(Treep )malloc(sizeof(Treenode));        rt->data=ch;        creat_tree(rt->left);        //构造左子树        creat_tree(rt->right);    //构造右子树        }}//前序遍历二叉树void pre_order(Treep &rt){    if(rt!=NULL)    {        cout<<rt->data<<"  ";        pre_order(rt->left);        pre_order(rt->right);    }}//中序遍历二叉树 void mid_order(Treep &rt){    if(rt!=NULL)    {        mid_order(rt->left);        cout<<rt->data<<"  ";        mid_order(rt->right);    }}//后序遍历二叉树void back_order(Treep &rt){    if(rt!=NULL)    {        back_order(rt->left);        back_order(rt->right);        cout<<rt->data<<"  ";    }}//层序遍历void leve_lorder(Treep &rt){    Treep q[100];        //指针数组,存放每个节点的地址    q[0]=rt;    int front=0,rear=1;    while(front<rear)    {        if(q[front])        {            cout<<q[front]->data<<" ";            if(q[front]->left)                q[rear++]=q[front]->left;            if(q[front]->right)                q[rear++]=q[front]->right;            front++;        }    }}//求二叉树的深度int depth_tree(Treep &rt){    int depth1=0,depth2=0;    if(NULL==rt)        return 0;    else    {        depth1=depth_tree(rt->left);        depth2=depth_tree(rt->right);        return (depth1>depth2) ? (depth1+1) : (depth2+1);    }}//求二叉树的节点个数int leaf_tree(Treep &rt){    if(rt)    {        if(rt->left==NULL && rt->right==NULL)        {            return 1;        }        return ( leaf_tree(rt->left) + leaf_tree(rt->right) + 1 );    }    else     {        return 0;    }}//查找二叉树中是否存在某元素int seach_tree(Treep &rt,char key){    if(rt==NULL)         return 0;     else     {         if(rt->data==key)         {            return 1;        }        else        {            if(seach_tree(rt->left,key) || seach_tree(rt->right,key))                return 1;    //如果左右子树有一个搜索到,就返回1            else                return 0;    //如果左右子树都没有搜索到,返回0        }    }}//销毁二叉树int  destroy_tree(Treep &root){    if(root==NULL)    {        return 0;    }    else    {        if(root->left)        destroy_tree(root->left);        if(root->right)        destroy_tree(root->right);        free(root);        root=NULL;    //释放内存后的指针要指向NULL        return 1;    }}//更改某节点的值void assign_tree(Treep &rt,char c,char value){    if(rt!=NULL)    {        if(c==rt->data)            rt->data=value;        assign_tree(rt->left,c,value);        assign_tree(rt->right,c,value);    }}//求双亲void parent_tree(Treep &rt,char value){    if(rt!=NULL)      {        if(value==rt->data)        {            cout<<"此节点是根节点!"<<endl;        }        if( (rt->left!=NULL && rt->left->data==value ) || (rt->right!=NULL && rt->right->data==value) )            cout<<rt->data<<endl;        else        {            parent_tree(rt->left,value);            parent_tree(rt->right,value);        }    }}//求左孩子void leftchild_tree(Treep &rt ,char value ){    if(rt!=NULL)    {        if(value==rt->data)        {            if(rt->left)                cout<<rt->left->data<<endl;            else                cout<<"左孩子为空!"<<endl;        }        else        {            leftchild_tree(rt->left ,value );            leftchild_tree(rt->right ,value );        }    }}//求右孩子void rightchild_tree(Treep &rt ,char value ){    if(rt!=NULL)    {        if(value==rt->data)        {            if(rt->right)                cout<<rt->right->data<<endl;            else                cout<<"右孩子为空!"<<endl;        }        else        {            rightchild_tree(rt->left ,value );            rightchild_tree(rt->right ,value );        }    }}//求左兄弟void leftbrother_tree(Treep &rt ,char value ){    if(rt!=NULL)    {        if(value==rt->data)        {            cout<<"此节点是根节点!"<<endl;        }        if(rt->left!=NULL && value==rt->left->data)        {                cout<<"此节点就是左孩子!"<<endl;        }        else if(rt->left!=NULL && value==rt->right->data)        {            if(rt->left)                cout<<rt->left->data<<endl;            else                cout<<"左兄弟为空!"<<endl;        }        else        {            leftbrother_tree(rt->left ,value );            leftbrother_tree(rt->right ,value );        }    }}//求右兄弟void rightbrother_tree(Treep &rt ,char value ){    if(rt!=NULL)    {        if(value==rt->data)        {            cout<<"此节点是根节点!"<<endl;        }        if(rt->right!=NULL && value==rt->right->data)        {                cout<<"此节点就是右孩子!"<<endl;        }        else if(rt->left!=NULL && value==rt->left->data)        {            if(rt->right)                cout<<rt->right->data<<endl;            else                cout<<"左兄弟为空!"<<endl;        }        else        {            rightbrother_tree(rt->left ,value );            rightbrother_tree(rt->right ,value );        }    }}//删除子树void delete_tree(Treep &rt,char ch,int bl){    if(rt!=NULL)    {        if(ch==rt->data)        {            if(!bl)                rt->left=NULL;            else                rt->right=NULL;        }        else        {            delete_tree(rt->left, ch, bl);            delete_tree(rt->right, ch, bl);        }    }}//插入子树void insert_tree(Treep &rt1,char ch,int bl,Treep &rt2){    if(rt1!=NULL)    {        if(ch==rt1->data)        {            if(!bl)            {                if( NULL==rt1->left)                {                    rt1->left=rt2;                }                else                {                    cout<<ch<<"的左节点非空!"<<endl;                }            }            else            {                if(NULL==rt1->right)                {                    rt1->right=rt2;                }                else                {                    cout<<ch<<"的右节点非空!"<<endl;                }            }        }        else        {            insert_tree(rt1->left, ch, bl,rt2);            insert_tree(rt1->right, ch, bl,rt2);        }    }}int main(){    Treep root;    init_tree(root);        //初始化树    cout<<"请输入二叉树,空值以#代表,输完要以Ctrl+Z表示结束,否则影响下个树的创建!:"<<endl;    creat_tree(root);        //创建二叉树    //前序遍历二叉树    cout<<"前序遍历序列是:"<<endl;    pre_order(root);    cout<<endl;    //中序遍历二叉树    //cout<<"中序遍历序列是:"<<endl;    //mid_order(root);    //cout<<endl;    //后序遍历二叉树    //cout<<"后序遍历序列是:"<<endl;    //back_order(root);    //cout<<endl;    //层序遍历二叉树    //cout<<"层序遍历序列是:"<<endl;    //leve_lorder(root);    //cout<<endl;    //求二叉树的深度    //cout<<"二叉树的深度:"<<endl;    //cout<<depth_tree(root);    //cout<<endl;    //查找二叉树中是否存在某元素    /*    cout<<"输入要查找的元素!"<<endl;    char ch;    cin>>ch;    if(seach_tree(root,ch)==1)        cout<<"yes!"<<endl;    else        cout<<"no!"<<endl;    */    //更改节点的值    /*    cout<<"输入你要改变的值和要改成的值:"<<endl;    char ch,value;    cin>>ch>>value;    assign_tree(root,ch,value);    pre_order(root);    cout<<endl;    */    //求双亲    //cout<<"你要找谁的双亲:"<<endl;    //char value;    //cin>>value;    //parent_tree(root ,value );    //求左孩子    //cout<<"你要找谁的左孩子:"<<endl;    //char value;    //cin>>value;    //leftchild_tree(root ,value );        //求右孩子    //cout<<"你要找谁的右孩子:"<<endl;    //char value;    //cin>>value;    //rightchild_tree(root ,value );    //求左兄弟    //cout<<"你要找谁的左兄弟:"<<endl;    //char value;    //cin>>value;    //leftbrother_tree(root ,value );    //求右兄弟    //cout<<"你要找谁的右兄弟:"<<endl;    //char value;    //cin>>value;    //rightbrother_tree(root ,value );    //cout<<"你要删除谁的子树:"<<endl;    //char value;    //cin>>value;    //delete_tree(root, value, 1);    //pre_order(root);    //cout<<endl;    //Treep root2;    //init_tree(root2);        //初始化树    //cout<<"请输入二叉树,空值以#代表:"<<endl;    //creat_tree(root2);        //创建二叉树    //cout<<"前序遍历序列是:"<<endl;    //pre_order(root2);    //cout<<endl;    //cout<<"你要插入谁的子树:"<<endl;    //char value;    //cin>>value;    //insert_tree(root,value,1,root2);    //pre_order(root);    //cout<<endl;        //求叶子结点个数    cout<<"结点个数:"<<endl;    cout<<leaf_tree(root)<<endl;    cout<<"销毁二叉树:"<<endl;    if(destroy_tree(root))        cout<<"销毁成功!"<<endl;    else        cout<<"空树,销毁不成功!"<<endl;    return 0;}