这里贴下二叉堆代码,包装了下vector,存储位置从0开始.可以参照<在A*寻路中使用二叉堆>
- //CBinaryHeap.h
- #pragma once
- #include <vector>
- struct Point
- {
- int r,c;
- }; //地图行列
- struct Node
- {
- int f,g,h;
- int r,c;
- int parent;
- };//路径地图节点
- class CBinaryHeap
- {
- public:
- CBinaryHeap(void);
- public:
- ~CBinaryHeap(void);
- private:
- int m_size; //元素数
- std::vector<Node> elementList;
- public:
- void Push(Node &node); //插入新节点
- void Pop(); //删除顶端
- void Top(Node &out_node); //返回顶端元素
- int Find(Node &out_node); //查找相同元素 返回0为没有 如果找到由参数传递
- void Change(int pos,Node &node); //交换元素 位置从1开始
- bool Empty(); //判断空
- void Clear(); //清空
- int Size(); //大小
- };
- //CBinaryHeap.cpp
- #include "BinaryHeap.h"
- using namespace std;
- CBinaryHeap::CBinaryHeap(void)
- {
- }
- CBinaryHeap::~CBinaryHeap(void)
- {
- }
- void CBinaryHeap::Push(Node &node) //插入新节点
- {
- elementList.push_back(node);
- int index=elementList.size()-1;
- Node temp;
- while (index>0&&elementList[index].f<=elementList[index/2].f)
- {
- temp=elementList[index];
- elementList[index]=elementList[index/2];
- elementList[index/2]=temp;
- index/=2;
- }
- }
- void CBinaryHeap::Pop() //删除顶端
- {
- elementList[0]=elementList.back();
- elementList.pop_back();
- m_size=elementList.size();
- int v=0,u=1;
- while (true) //v!=u
- {
- u=v;
- if ((u*2+2)<m_size)
- {
- if (elementList[u].f>=elementList[2*u+1].f)
- {
- v=2*u+1; //和左边比较
- }
- if (elementList[v].f>=elementList[2*u+2].f)
- {
- v=2*u+2; //用左边和右边比较
- }
- }
- else if (2*u+1<m_size)
- {
- if (elementList[u].f>=elementList[2*u+1].f)
- {
- v=2*u+1;
- }
- }
- Node temp;
- if (v!=u)
- {
- temp=elementList[u];
- elementList[u]=elementList[v];
- elementList[v]=temp;
- }
- else break;
- }
- }
- void CBinaryHeap::Top(Node &node) //返回顶端元素
- {
- node=elementList.front();
- }
- int CBinaryHeap::Find(Node &node) //查找相同元素
- {
- for (int i=0;i<elementList.size();i++)
- {
- if (elementList[i].r==node.r&&elementList[i].c==node.c)
- {
- node=elementList[i];
- return i+1;
- }
- }
- return 0;
- }
- void CBinaryHeap::Change(int pos,Node &node) //交换元素
- {
- if (pos>0)
- {
- int index=pos-1;
- Node temp;
- elementList[index]=node;
- while (index>0&&elementList[index].f<=elementList[index/2].f)
- {
- temp=elementList[index];
- elementList[index]=elementList[index/2];
- elementList[index/2]=temp;
- index/=2;
- }
- }
- }
- bool CBinaryHeap::Empty() //判断空
- {
- return elementList.empty();
- }
- void CBinaryHeap::Clear() //清空
- {
- elementList.clear();
- }
- int CBinaryHeap::Size() //大小
- {
- m_size=elementList.size();
- return m_size;
- }