二叉树的顺序存储结构

二叉树的顺序存储结构
#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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值