数据结构实验——二叉树的常见操作

来源:互联网 发布:iphone赚钱软件排行 编辑:程序博客网 时间:2024/05/16 17:34

要求:

⑴输入字符序列,建立二叉链表。

⑵中序遍历二叉树:递归算法。

⑶中序遍历二叉树:非递归算法。(最好也能实现先序,后序非递归算法)

⑷求二叉树的高度。

⑸求二叉树的叶子个数。

*⑹将二叉链表视为森林的孩子兄弟链表,计算森林中叶子个数。

*⑺建立中序线索二叉树,并实现中序遍历。

⑻借助队列实现二叉树的层次遍历。 

⑼在主函数中设计一个简单的菜单,分别调试上述算法。

#include <iostream>#include <string.h>#include <stdio.h>#include <algorithm>using namespace std;#define NULL 0#define N 10typedef int ELEMTP;typedef struct node{    ELEMTP data;    struct node *lchild,*rchild;} TNode;//创建二叉树TNode * create_tree(){    TNode *t;    ELEMTP x;    cin>>x;    if(x!=0)    {        t=new TNode;        t->data=x;        t->lchild=create_tree();        t->rchild=create_tree();    }    else        t=NULL;    return t;}//创建二叉树的另一种方法void create_tree1(TNode **t){    ELEMTP x;    cin>>x;    if(x==0)        *t=NULL;    else    {        *t=new TNode;        (*t)->data=x;        create_tree1(&((*t)->lchild));        create_tree1(&((*t)->rchild));    }}//递归先序遍历二叉树void preorder(TNode *t){    if(t)    {        cout<<t->data<<"      ";        preorder(t->lchild);        preorder(t->rchild);    }}// 递归中序遍历二叉树void inorder(TNode *t){    if(t)    {        inorder(t->lchild);        cout<<t->data<<"      ";        inorder(t->rchild);    }}//递归后序遍历二叉树void pasorder(TNode *t){    if(t)    {        pasorder(t->lchild);        pasorder(t->rchild);        cout<<t->data<<"      ";    }}//递归算法求二叉树叶子结点数void count_leaf(TNode *t,int *n){    if(t)    {        if(t->lchild==NULL && t->rchild==NULL)            (*n)++;        count_leaf(t->lchild,n);        count_leaf(t->rchild,n);    }}//递归算法求二叉树的高度int hight_bit(TNode *t){    int l,h;    if(t)    {        l=hight_bit(t->lchild);        h=hight_bit(t->rchild);        if(l>h)            return l+1;        else            return h+1;    }    else        return 0;}//递归算法将二叉树的左右子数交换void exchange(TNode **t){    TNode *p;    if(*t)    {        exchange(&((*t)->lchild));        exchange(&((*t)->rchild));        p=(*t)->lchild;        (*t)->lchild=(*t)->rchild;        (*t)->rchild=p;    }}//非递归先序遍历算法void preorder1(TNode *t){    TNode * s[N],*p;    int top;    top=0;    p=t;    while(p || top>0)    {        while(p)        {            cout<<p->data<<"      ";            top++;            s[top]=p;            p=p->lchild;        }        if(top>0)        {            p=s[top];            --top;            p=p->rchild;        }    }}//二叉树中序非递归算法void inorder1(TNode *t){    TNode *p,*s[N];    int top;    top=0;    p=t;    while(p || top>0)    {        while(p)        {            top++;            s[top]=p;            p=p->lchild;        }        if(top>0)        {            p=s[top];            top--;            cout<<p->data<<"      ";            p=p->rchild;        }    }}//二叉树后根非递归算法void pasorder1(TNode *t){    struct    {        TNode *pp;        int tag;    } ss[N];    int top;    TNode *p;    top=0;    p=t;    while(p || top>0)    {        while(p)        {            top++;            ss[top].tag=0;            ss[top].pp=p;            p=p->lchild;        }        if(top>0)            if(ss[top].tag==0)            {                ss[top].tag=1;                p=ss[top].pp;                p=p->rchild;            }            else            {                p=ss[top].pp;                cout<<p->data<<"      ";                top--;                p=NULL;            }    }}//非递归先序方法求二叉数叶子结点数void count_leaf1(TNode *t,int *n){    TNode *s[N],*p;    int top;    top=0;    p=t;    while(p || top>0)    {        if(p)        {            if(p->lchild==NULL && p->rchild==NULL)                (*n)++;            top++;            s[top]=p;            p=p->lchild;        }        else        {            p=s[top];            top--;            p=p->rchild;        }    }}//非递归中序求二叉树叶子结点数int count_leaf2(TNode *t){    int n,top;    TNode *s[N],*p;    n=0;    top=0;    p=t;    while(p || top>0)    {        while(p)        {            top++;            s[top]=p;            p=p->lchild;        }        p=s[top];        top--;        if(p->lchild==NULL && p->rchild==NULL)            n++;        p=p->rchild;    }    return n;}//非递归后序求二叉树叶子结点数int count_leaf3(TNode *t){    struct    {        TNode *pp;        int tag;    } s[N],ss;    int top,n;    TNode *p;    top=0;    n=0;    p=t;    while(p || top>0)    {        while(p)        {            top++;            s[top].pp=p;            s[top].tag=0;            p=p->lchild;        }        ss=s[top];        top--;        if(ss.tag==0)        {            ss.tag=1;            top++;            s[top]=ss;            p=ss.pp->rchild;        }        else        {            p=ss.pp;            if(p->lchild==NULL && p->rchild==NULL)                n++;            p=NULL;        }    }    return n;}//求给定结点的所有祖先和祖先数int count_zx(TNode *t,ELEMTP x){    struct    {        TNode *pp;        int tag;    } s[N],ss;    int top,n;    TNode *p;    top=0;    n=0;    p=t;    while( p || top>0)    {        while(p)        {            top++;            s[top].pp=p;            s[top].tag=0;            p=p->lchild;        }        ss=s[top];        top--;        if(ss.tag==0)        {            ss.tag=1;            top++;            s[top]=ss;            p=ss.pp->rchild;        }        else        {            if(ss.pp->data==x)                break;            p=NULL;        }    }    cout<<"the zx wei:"<<endl;    for(n=1; n<=top; n++)    {        p=s[n].pp;        cout<<p->data<<"   ";    }    return top;}//非递归算法求二叉树的高度算法int hight_bit1(TNode *t){    TNode * s[N];    ELEMTP node[N];//保存叶子结点    int top,i,j,h,n;    TNode *p;    top=0;    n=0;    p=t;    while(p || top>0)    {        if(p)        {            if(p->lchild==NULL && p->rchild==NULL)                node[n++]=p->data;            top++;            s[top]=p;            p=p->lchild;        }        else        {            p=s[top];            top--;            p=p->rchild;        }    }    cout<<"the leaf is:";    for(i=0; i<n; i++)        cout<<node[i];    h=-32767;    for(i=0; i<n; i++)        if(h<count_zx(t,node[i])) //求所在叶结点的祖先数            h= count_zx(t,node[i])+1;    return h+1;}int  main(){    TNode *t;    int num;// t=create_tree();    create_tree1(&t);    preorder(t);    cout<<endl;//  preorder1(t);//  cout<<endl;//  inorder(t);//  cout<<endl;//  inorder1(t);//  cout<<endl;//  pasorder(t);// cout<<endl;//  pasorder1(t);//    cout<<endl;    num=0;// count_leaf(t,&num);// count_leaf1(t,&num);//num=count_leaf2(t);    num=count_leaf3(t);    cout<<"the binary tree's leaf is:"<<num<<"个";    cout<<endl;//求给定结点的所有祖先和祖先数    num=count_zx(t,6);    cout<<endl<<num;    cout<<endl;//递归算法求二叉树的高度//num= hight_bit(t);//cout<<"the binary tree's hight is:"<<num;//cout<<endl;//num=hight_bit1(t);// cout<<"the hight is:"<<num;//递归算法将二叉树的左右子数交换// exchange(&t);// cout<<endl;// preorder(t);   return 0;}





 

作者:王老师

(Yran有改动)
 

0 0
原创粉丝点击