实验四 二叉树(顺序)

这篇博客详细讲解了如何进行二叉树的顺序遍历,包括前序、中序和后序遍历的方法和步骤,同时探讨了递归和非递归实现的优缺点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

顺序存储上面二叉树

#include<iostream.h>  
const int Maxsize=50;  
class Tree  
{  
public:  
    Tree();  
    ~Tree(){}  
    int Create();  
    void LeverOrder();  
    void Print();  
    void Printleaf();  
    int tree[Maxsize];  
    int count;  
    int num;  
};  
Tree::Tree()  
{  
    for(int i=0;i<Maxsize;i++)  
        tree[i]=-1;  
    count=0;  
}  
int Tree::Create()  
{  
    int n,i=1;  
    num=0;  
    count=0;  
    cout<<"请按照从上到下、从左到右的顺序依次输入二叉树各个结点,空节点用0表示,以-1表示输入结束:"<<endl;  
    while(cin>>n&&n!=-1&&i<Maxsize)  
    {  
        tree[i]=n;  
        i++;  
        num++;  
        if(n==0) continue;  
        else count++;  
    }  
    return 0;  
}  
void Tree::LeverOrder()  
{  
    if(tree[1]==-1)throw"NULL";  
    for(int i=1;tree[i]!=-1&&i<100;i++)  
        cout<<tree[i]<<" ";  
    cout<<"层序遍历:";  
    for(i=1;tree[i]!=-1&&i<Maxsize;i++)  
    {  
        if(tree[i]==0)continue;  
        cout<<tree[i]<<" ";  
    }  
}  
void Tree::Print()  
{  
    for(int i=1;tree[i]!=-1&&i<Maxsize;i++)  
    {  
        static int j=0;  
        if(tree[i]==0)continue;  
        else j++;  
        cout<<"第"<<j<<"个结点信息为"<<tree[i]<<" ";  
        if(tree[2*i]==0||tree[2*i]==-1)  
            cout<<"该结点无左孩子"<<" ";  
        else   
            cout<<"左孩子为:"<<tree[2*i]<<" ";  
        if(tree[2*i+1]==0||tree[2*i+1]==-1)  
            cout<<"该结点无右孩子"<<" ";  
        else  
            cout<<"右孩子为:"<<tree[2*i+1]<<" ";  
        if(int(i/2)==0)  
            cout<<"该结点为根结点,无双亲"<<endl;  
        else if(tree[int(i/2)]==0)   
            cout<<"该结点的双亲为:"<<tree[int(i/2)+1]<<endl;  
        else   
            cout<<"该结点的双亲为:"<<tree[int(i/2)]<<endl;  
    }  
}  
void Tree::Printleaf()  
{  
    cout<<"所有的叶子结点信息为:";  
    for(int i=1;i<num+1;i++)  
{  
        if((tree[2*i]==0||tree[2*i]==-1)&&(tree[2*i+1]==0||tree[2*i+1]==-1))  
            if(tree[i]!=0&&tree[i]!=-1)  
                cout<<tree[i]<<" ";  
    }  
}  
void main()  
{  
    Tree b;  
    b.Create();  
    cout<<"";  
    try  
    {  
        b.LeverOrder();  
        cout<<endl;  
    }  
    catch(char *s)  
    {  
        cout<<s<<endl;  
    }  
    cout<<"共有"<<b.count<<"个有效结点"<<endl;  
    b.Print();  
    b.Printleaf();  
    cout<<endl;  
}  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值