基于完全二叉树的极大堆的上下漂移实现

 1 //基于完全二叉树的极大堆的上下漂移实现 

 2 //INT_MAX极大数 INT_MIN极小数 

 3 #include <cstdlib>

 4 #include <iostream>

 5 #include <vector> 

 6 #define N 11

 7 

 8 using namespace std;

 9 

10 typedef int  T;     //!!!!!!!

11 typedef vector<T>::iterator TP;//!!!!!

12 

13 void shiftup(TP a,int n){

14      for(int p=n/2;p>0&&(a[p]<a[n]);p=(n=p)/2)//向量可以这样索引 

15       std::swap(a[p],a[n]); 

16 } 

17      

18      

19 void shiftdown(TP a,int n){

20      for(int p=1,bc=2;bc<=n;bc=2*p){

21        if(bc<n&&(a[bc]<a[bc+1])) ++bc;

22        if(a[p]<a[bc]) {std::swap(a[bc],a[p]);p=bc;}

23        else break;      

24              }

25      }

26  

27  

28  

29  

30  int main(){  

31  vector<int> vv;

32  vv.reserve(2*N);

33 vv.push_back(INT_MAX); //INT_MAX极大数 INT_MIN极小数 

34  //vv[0]=INT_MAX;//!!! 

35  //cout<<vv[0]<<endl;

36  //system("PAUSE");

37 //    return 1;

38  //for(int i=1;i<21;i++)

39  vv.push_back(88);

40  vv.push_back(75);

41  vv.push_back(83);

42  vv.push_back(65);

43  vv.push_back(55);

44  vv.push_back(63);

45  vv.push_back(53);

46  vv.push_back(45);

47  vv.push_back(35);

48  //vv[2]=14;//用地址+【】进行索引 

49  TP first=vv.begin();

50  //!!!定义向量的指针用该语句,而非用取地址符号来定义 

51 //cout<<vv[0]<<endl;  

52 for(int i=0;i<N-1;i++)

53    cout<<vv[i]<<endl;

54  

55  int o=91;

56 //极大堆的shiftup操作实现 

57 cout<<"now add value to MAX_HEAP:"<<o<<endl;

58 vv.push_back(o);

59 shiftup(first,N-1);

60 cout<<"after shiftup operation:"<<endl; 

61 for(int i=0;i<N;i++)

62    cout<<vv[i]<<endl;

63    

64 std::swap(vv[N-1],vv[1]);

65 shiftdown(first,N-1);   

66 cout<<"after shiftdown operation:"<<endl;

67    for(int i=0;i<N;i++)

68    cout<<vv[i]<<endl;

69    

70     system("PAUSE");

71     return 1;

72 }

73 

74  

 

你可能感兴趣的:(二叉树)