孩子父亲表示法表示树

#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;

}

转载于:https://www.cnblogs.com/-wang-xin/archive/2012/11/23/2785101.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值