堆中任一下标到根节点的路径


```cpp
题目描述  输入两个数字 
第一个是 M个节点  
第二个是  N个路径
打印这N个下标到根节点的路径
#include<iostream>
using namespace std;
#define Max 60
    typedef struct student
        {
            int *data;
            int Size; //定义当前元素的个数
            int capacity;  //定义最大容量
        }*MaxHeap,maxheap;

 void init_Maxheap(MaxHeap &L); //初始化最大堆
 bool heap_full(MaxHeap &L); //判断最大堆是否为空
 void Creat_init(MaxHeap &L,int Max_soldier) ;//创造最大堆
 void insert_data(MaxHeap &L,int data); //最大堆插入节点
 void printlist(MaxHeap L);  //打印所有的节点
 void printlist(MaxHeap L,int e) ; //打印e节点到根节点的所有值

    int main()
        {
            MaxHeap L;
            init_Maxheap(L);
            int Max_soldier=1000; //定义一个哨兵元素
            Creat_init(L,Max_soldier);
            int n,m,data;
            cout<<"您想创建几个节点"<<endl;
            cin>>n;
            cout<<"你想打印几个节点到根节点的路径"<<endl;
            cin>>m;
            int i;
            for(i=1;i<=n;i++)
            {
                cin>>data;
                insert_data(L,data);
            }

            int value;
            for(i=1;i<=m;i++)
            {
                cout<<"请输入第"<<i<<"个节点"<<endl;
                cin>>value;
                printlist(L,value);
            }

        }

    void init_Maxheap(MaxHeap &L)  //初始化最大堆
        {
           L=NULL;
        }


    bool heap_full(MaxHeap &L)  //判断最大堆是否为空
        {
            if(L==NULL)  //如果还没有初始化
            {
                return true;
            }

            else if(L->Size==L->capacity) //如果已经满了
            {
                return true;
            }

            else    //好没满
            {
                return false;
            }
        }

    void Creat_init(MaxHeap &L,int Max_soldier)  //创造最大堆
        {
            if(L==NULL)
                {
                    L=new maxheap;
                    L->data=new int[Max+1]; //堆中的元素都是从0开始
                    L->data[0]=Max_soldier; //定义一个哨兵最大元素
                    L->Size=0;
                    L->capacity=Max;
                }
            else
                {
                    cout<<"您已经初始化了呦"<<endl;
                    return ;
                }
        }


    void insert_data(MaxHeap &L,int data)   //最大堆插入节点
        {
           if(heap_full(L)==true) //如果这棵树已经满了
           {
               return ;
           }

           else
           {
               int i=L->Size+1;  //指向要差插入节点的位置
               while(L->data[i/2]<data)
               {
                   L->data[i]=L->data[i/2];
                   i=i/2;  //指向父节点
               }

               L->data[i]=data;
               L->Size++;
           }

        }

    void printlist(MaxHeap L,int e)  //打印e节点到根节点的所有值
        {
           if(e<0||e>L->Size)

               {
                   return ;
               }

            while(e>=1)

                {
                    cout<<L->data[e];
                    e=e/2;
                }
            cout<<endl;
        }




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值