数据结构——树的双亲表示法

#include <iostream>
using namespace std;

#define MAX_TREE_SIZE 100
typedef struct     //节点结构
{
    char data;
    int parent;        //双亲位置域
}PTNode;

typedef struct        //树结构
{
    PTNode node[MAX_TREE_SIZE];
    int count;        //根的位置和节点个数
}PTree;

//初始化树
void init_ptree(PTree &tree)
{
    tree.count=-1;
}
//添加节点
void add_ptnode(PTree &tree, PTNode ptnode)
{
    tree.count++;
    tree.node[tree.count].data = ptnode.data;
    tree.node[tree.count].parent = ptnode.parent;
}
//输出树
void print_ptree(PTree &tree)
{
    int i;
    for(i=0;i<=tree.count;i++)
    {
        cout<<"   "<<i<<"        "<<tree.node[i].data<<"        "<<tree.node[i].parent<<endl;
    }
}
//前序遍历
void PreOrder(PTree &tree , int num)
{
    for(int i=num; i<=tree.count; i++)
    {
           if(i == num)
           {
                cout<<"   "<<i<<"        "<<tree.node[i].data<<"        "<<tree.node[i].parent<<endl;
                for(int j=num+1 ; j<=tree.count; j++)
                {
                     if(tree.node[j].parent == i)
                     {
                        PreOrder(tree , j);
                     }
                }
           }
    }
}//PreOrder
//树没有中序遍历
//后序遍历
void BackOrder(PTree &tree , int num)
{
    for(int i=num; i<=tree.count; i++)
    {
           if(i == num)
           {
                for(int j=num+1 ; j<=tree.count; j++)
                {
                     if(tree.node[j].parent == i)
                     {
                        BackOrder(tree , j);
                     }
                }
                cout<<"   "<<i<<"        "<<tree.node[i].data<<"        "<<tree.node[i].parent<<endl;
                
           }
    }
}//BackOrder

int main()
{
    FILE *fin=fopen("树的表示法.txt","r");

    PTree ptree;
    init_ptree(ptree);
    PTNode ptnode;

    while(fscanf(fin,"%c%d",&ptnode.data,&ptnode.parent)!=EOF)
    {
        add_ptnode(ptree,ptnode);
        fscanf(fin,"%c%d",&ptnode.data,&ptnode.parent);
    }
    //输出树
    cout<<"数组下标  节点值  双亲位置"<<endl;
    print_ptree(ptree);


    //前序遍历
    //cout<<endl;
    //PreOrder(ptree,0);

    //后序遍历
    //cout<<endl;
    //BackOrder(ptree,0);

    fclose(fin);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

minyuanxiani

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值