堆的结构分析与应用

  

,,,,在二叉树中,我们用两种方法表示二叉树,一个是链表,一个是数组,但是数组比较适用于满二叉树或者完全二叉树。

,,,,堆数据结构是一种数组对象,它可以被视为一棵完全二叉树结构。

,,,,堆结构的二叉树存储有两种方法:

,,,,,,,,最大堆:每个父节点的都大于孩子节点。

,,,,,,,,最小堆:每个父节点的都小于孩子节点。

# include   # include   # include      using  namespace 性传播疾病;      template   堆class    {   公众:   堆()//无参类型的构造函数   {}   堆(T  *, size_t 大小)//有参类型的构造函数   {   assert ();      for  (size_t 小姐:=,0;,小姐:& lt;,大小;,我+ +)   {   _a.push_back([我]);   }//建堆,用,向下调整,算法//对于一个完全二叉树,其结点的父子关系与数组的下标的关系://左子下标=,父结点下标* 2 + 1//右子下标=父结点下标* 2 + 2   for  (int  j =, (_a.size(),安康;2),/,2,,j 祝辞=,0;,j -)//找到倒数第一个非叶子结点(最后一个元素一定是非叶子结点的子节点)   {   _AdjustDown (j);   }/*   在第一次写时定义了j为size_t类型,由于j不管怎么运算都是无符号类型所以   j>=0并没有起到限制的作用,导致了死循环   */}   公众:   void 推动(const  T , x)//在最后加入一个节点   {   _a.push_back (x);   _AdjustUp (_a.size(),安康;1);//向上调整,传入最后一个元素下标(调整x的位置)   }      void  Pop()//把最大的删掉(根)   {   断言(! _a.empty ());      交换(_a [0], _a [_a.size(),安康;1]);//把根节点和最后一个节点交换   _a.pop_back();//删掉最后一个节点   _AdjustDown(0);//向下调整   }      void  Print ()   {   for  (size_t 小姐:=,0;,小姐:& lt;, _a.size();,我+ +)   {   cout  & lt; & lt;, _a[我]& lt; & lt;“,”;   }   cout  & lt; & lt;, endl;   }   size_t 尺寸()   {   return  _a.size ();   }   bool 空()   {   return  _a.empty ();   }   保护:   void  _AdjustDown (size_t 父母)//时间复杂度O (log2 (N))   {   size_t  child =, parent  *, 2, +, 1,,//找到其左孩子   while  (child  & lt;, _a.size ())   {   if ((时间+ child  1), & lt;, _a.size (),,,, _a(孩子),& lt;, _a [child  +, 1])//若左孩子小于右孩子(且必须结点下标不超过范围)   {   + +孩子;//指向大的   }   if  (_a(孩子)在_a(父))//若孩子大于父,则把大的放在父结点上   {   交换(_a(孩子),_a(父));   时间=parent 儿童;//父和子调整后要继续向下调整交换后的子节点   *=child  parent  2, +, 1;//现在这个调整后的节点的子节点   }   其他的   打破;   }   }      void  _AdjustUp (size_t 孩子)//时间复杂度O (log2 (N))   {   size_t  parent =, (child 安康;1),/,2;   while  (child 祝辞,0)   {   if  (_a(孩子),祝辞,_a(父))   {   交换(_a(孩子),_a(父));   时间=child 家长;   parent =, (child 安康;1),/,2;   }   其他的   打破;   }      }   私人:   vector

测试函数

void 测试()   {   int [10],=,{, 5, 10, 34岁,24岁,2,4,17日,23日,12日,9日,};   Heap

,,,,上面实现了最大堆,最小堆方法同最大堆,但是再在类中重新一遍则会使程序的可维护性降低,所以我们用来实现。

,

仿函数


<代码类=" cpp字大胆"> struct ,<代码类=" cpp平原"> 自由<代码类=癱pp平原”>{,,,,<代码类=癱pp空间”>, <代码类=" cpp字大胆">空白,<代码类=癱pp平原”>操作符()( <代码类=" cpp字大胆">空白,<代码类=癱pp平原”> * ptr) ,,,<代码类=癱pp空间”>,, <代码类=癱pp平原”>{,<代码类=癱pp空间”>,,,, <代码类=" cpp功能大胆">免费

堆的结构分析与应用