二叉树的顺序存储结构

来源:互联网 发布:卸载mac上的软件 编辑:程序博客网 时间:2024/05/24 00:57

二叉树的顺序存储结构#include<iostream>#include<cstdio>using namespace std;#define Virnode '0'//定义虚拟节点#define MAX_TREE_SIZE 100//定义存储空间最大量typedef char Elemtype;//定义节点类型typedef Elemtype SqBitTree[MAX_TREE_SIZE];//SqbitTree[0]单元存放节点的总数,通常存放构成满二叉树的节点总数void leveltree(SqBitTree bt)//按满二叉树遍历{    int i=1;    while(i<=bt[0])    {        for(int j=i;j<2*i;j++){//按层扫描            if(bt[j]==Virnode) cout<<"*";            else cout<<bt[j];        }        cout<<endl;        i*=2;//跳到下一层的节点    }}void crebitree (SqBitTree bt,int n)//n为真实节点{    int m=0;    int i=1;    while(m<n)    {        for(int j=i;j<2*i;j++){//按层次输入,虚拟节点值一起输入            scanf("%c",bt+j);            if(bt[j]!=Virnode) m++;        }        i*=2;    }    bt[0]=i-1;//存放满二叉树的节点总数}void exchange(SqBitTree bt){    int k=2;    while(k<=bt[0])    {        for(int i=k,j=2*k-1;i<j;i++,j--)        {Elemtype t=bt[i];bt[i]=bt[j];bt[j]=t;}        k*=2;    }}int coutleaf(SqBitTree bt){    int i=1;    int cnt=0;    while(i<=bt[0]/2)//按性质可知,凡是大于bt[0]/2的节点均为叶子节点    {        for(int j=i;j<2*i;j++)            if(bt[j]!=Virnode&&bt[2*j]==Virnode&&bt[2*j+1]==Virnode)                cnt++;        i*=2;    }    for(int j=i;j<2*i;j++)//最底层不是虚拟节点,就是叶子节点        if(bt[j]!=Virnode) cnt++;    return cnt;}int high(SqBitTree bt){    int h=0;    int i=1;    while(i<=bt[0])    {        h++;        i*=2;    }    return h;}int count2(SqBitTree bt){    int i=1;    int cnt=0;    while(i<=bt[0]/2)//由性质可知,大于bt[0]/2的节点不可能是度为2的节点    {        for(int j=i;j<i*2;j++)            if(bt[j]!=Virnode&&bt[j*2]!=Virnode&&bt[j*2+1]!=Virnode)                cnt++;        i*=2;    }    return cnt;}int count1(SqBitTree bt){    int i=1;    int cnt=0;    while(i<=bt[0]/2)//由性质可知,大于bt[0]/2的节点不可能是度为1的节点    {        for(int j=i;j<2*i;j++)            if(bt[j]!=Virnode&&((bt[j*2]==Virnode&&bt[j*2+1]!=Virnode)||(bt[j*2+1]==Virnode&&bt[j*2]!=Virnode)))               cnt++;        i*=2;    }    return cnt;}void search(SqBitTree bt,Elemtype x,Elemtype *pa,Elemtype *lc,Elemtype *rc){    int i=1;    while(i<=bt[0]&&bt[i]!=x) i++;    if(i>bt[0]){cout<<"Not found"<<endl;*pa=*lc=*rc=Virnode;return ;}    if(i==1) {cout<<"This node has not parents"<<endl;*pa=Virnode;}    else *pa=bt[i/2];    if(i>bt[0]/2||bt[i*2]==Virnode) {cout<<"This node has not left child"<<endl;*lc=Virnode;}    else *lc=bt[i*2];    if(i>bt[0]/2||bt[i*2+1]==Virnode) {cout<<"This node has not right child"<<endl; *rc=Virnode;}    else *rc=bt[i*2+1];}int main(){    SqBitTree bt;    int n;    int leaf;    int h;    Elemtype x,*pa,*lc,*rc;    pa=(Elemtype *)malloc(sizeof(Elemtype));    lc=(Elemtype *)malloc(sizeof(Elemtype));    rc=(Elemtype *)malloc(sizeof(Elemtype));    cin>>n;    getchar();    memset(bt,0,sizeof(bt));    crebitree(bt,n);    leveltree(bt);    exchange(bt);    leveltree(bt);    leaf=coutleaf(bt);    cout<<leaf<<endl;    h=high(bt);    cout<<h<<endl;    cout<<count2(bt)<<endl;    cout<<count1(bt)<<endl;    cin>>x;    search(bt,x,pa,lc,rc);    cout<<*pa<<" "<<*lc<<" "<<*rc<<endl;    return 0;}


0 0
原创粉丝点击